CodingGuidelinesObjectiveC

Sequence

The first thing in every .h or .m file is the license block (GPL or otherwise)

The next thing are all #include statements

  • first comes a block with includes from the project (if any) with a leading comment "Project includes"
  • second come all other includes, where includes from the same external source are grouped together in blocks, each block having a header comment that specifies the source

The third thing are forward declarations, with a leading comment "Forward declarations"

The fourth thing, where applicaple are the following things grouped together in blocks, each block having a header comment specifying the block's content

  • enumerations
  • declarations of helper classes/structs
  • constants
  • #define statements (try not to use)
  • typedefs (try not to use)
  • categories

The last thing is either the main class' interface (in the .h file) or implementation (in the .m file).

Methods are implemented in the following order: init, alloc, new, copy, dealloc, other methods.


Example (omitting the license):


// Cocoa
#import <Cocoa/Cocoa.h>

// Forward declarations
@class AceXpanderItem;
@class AceXpanderThread;

// Enumerations
enum AceXpanderItemState
{
   QueuedState     = 0,
   SkipState       = 1,
   ProcessingState = 2,
   AbortedState    = 3,
   SuccessState    = 4,
   FailureState    = 5
};

 
@interface AceXpanderModel : NSObject
{
@private
  NSTableView* m_theTable;
  // ...
}

- (id) init;
  // ...

@end


Documentation

Everything needs to be documented with doxygen documentation blocks.

Doxygen commands are written javadoc-style, using the "@" prefix. Documentation lines should start with the "///" notation:

/// @brief bla bla bla

Documentation blocks should start and end with a distinct separator line. The separator line should start with "//" to prevent doxygen from parsing it.

// -----------------------------------------------------------------------------
/// @brief bla bla bla
///
/// detailed description bla bla bla
// -----------------------------------------------------------------------------


The class documentation is placed in front of the @interface keyword of the class. Because ObjectiveC does not use the "class" keyword, doxygen must be explicitly told that this is a class documentation:

/// @class AceXpanderItem
/// ... 


Doxygen recognizes categories, so we don't have to explicitly identify them:


/// @brief This category declares private methods for the AceXpanderItem class. 
@interface AceXpanderItem(Private)
// ...
@end


Doxygen automatically generates links to methods if they are referenced using the following syntax:

/// @note This is an internal helper method. It is called exactly once per
/// object, from initWithLine:().


Doxygen prints out a warning that methods are undocumented if they appear in declarations of private categories without a grouping around them'. In the following example the method dealloc() is documented, but resetResults() is not:

@interface DGSMonXServer(Private)
/// @name Initialization and deallocation
//@{
- (void) dealloc;
//@}

- (void) resetResults;

Notes:

  • Even if warnings are printed, the actual documentation is properly generated
  • I encountered the problem with Doxygen 1.5.6, it might be fixed in later versions


Identifier names

Class names start with an uppercase letter and use camel case.

Method names start with a lowercase letter and use camel case.

Member variables (regardless of whether they are instance or class members) use a prefix "m_". A member variable that corresponds to a property uses the property's name (e.g. m_icon).

Simple getter methods use the same name as the property (e.g. icon).

Setter methods use the property name prefixed with "set" (e.g. setIcon).


Miscellaneous

Private methods of a class are declared in a separate category named "Private" in the .m file. For instance:

@interface AceXpanderItem(Private)
// ... methods ...
@end