Protocols with optional properties?

Protocols with optional properties?

The short version is that I have a protocol which has an optional parameter. When I build a class that implements it with the iPhone SDK 3.x it compiles just fine, with no errors or warnings. When I used the 2.x SDK I get the following warning:

Class.m:68: warning: property 'field' requires method '-field' to be defined - use @synthesize, @dynamic or provide a method implementation 

It works just fine in both cases.

So two questions:

  1. What is the right way to fix the warning? I added @dynamic to the implementation which isn't really correct as the property really isn't there.
  2. Why does work in SDK 3.x but not 2.x? The docs say "On Mac OS X v10.5, protocols may not include optional declared properties." Clearly that's not exactly the case here.

Here's a quick sample of the kind of code I have to make things a little more obvious if I wasn't completely clear.

@protocol MyProtocol   @required     - (void) method:(NSString*)param;   @optional     @property (nonatomic,retain) NSString* field; @end  @interface MyClass : NSObject<MyProtocol> { } - (void) method:(NSString*)param; @end 

return value javascript UIWebView


Web image display in iPhone app
The iPhone SDK is not exactly identical to any paricular version of Mac OS X. Does jquery work on the iphone´s safari?Clearly a newer version of the toolset is included with SDK 3 that's more similar to the one from Snow Leopard.. Using a struct with OCMock or Hamcrest
How to build Apple's GCC on Linux/Windows?Is if (variable) the same as if (variable != nil) in Objective-C


AES interoperability between .Net and iPhone?
The simnple way to remove the warning is to add. Remote database connection with my iPhone application using Cocos2d @dynamic field;. to your implementation. That tells the compiler this you will provide the implementation dynamically, which you wont, becuase its an optional property, although this should shut the compiler up..


The @optional was introduced in Objective-C 2.0 so it won't be applicable for older versions of the SDK. Your best bet is to determine whether it should be present (probably not) and then #ifdef this around with .
#if __OBJC2__ @optional @property ... #endif 
Then it should only compile under an OBJC2, and it won't be present in the older systems as part of the protocol itself..

62 out of 100 based on 42 user ratings 242 reviews