Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
604 views
in Technique[技术] by (71.8m points)

llvm - Under what conditions is @synthesize automatic in Objective-c?

Under what conditions is @synthesize automatic in Objective-c?

Perhaps when using LLVM 3.0 and up? From reading around the net it seems like @synthesize is unnecessary starting with Xcode 4. However I'm using Xcode 4 and receiving warnings when I don't @synthesize a property.

Some of the responses to Why don't properties get automatically synthesized seem to imply @synthesize can be omitted at some point under some circumstances.

Another (old) reference hinting that @synthesize might be automatic at some point in the future.

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

As of clang 3.2 (circa February 2012), "default synthesis" (or "auto property synthesis") of Objective-C properties is provided by default. It's essentially as described in the blog post you originally read: http://www.mcubedsw.com/blog/index.php/site/comments/new_objective-c_features/ (except that that post describes the feature as "enabled, then disabled"; I don't know if that's an issue with Xcode or if the clang developers themselves have gone back and forth on the question).

As far as I know, the only case in which properties will not be default-synthesized in clang 3.2 is when those properties have been inherited from a protocol. Here's an example:

#import <Foundation/Foundation.h>

@protocol P
@property int finicky;
@end

@interface A : NSObject <P>
@property int easygoing;
@end

@implementation A
@end

int main() { A *a = [A new]; a.easygoing = 0; a.finicky = 1; }

If you compile this example, you'll get a warning:

test.m:11:17: warning: auto property synthesis will not synthesize property
      declared in a protocol [-Wobjc-protocol-property-synthesis]
@implementation A
                ^
test.m:4:15: note: property declared here
@property int finicky;
              ^
1 warning generated.

and if you run it, you'll get an error from the runtime:

objc[45820]: A: Does not recognize selector forward:: (while forwarding setFinicky:)
Illegal instruction: 4

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...