Objective-C:没有实现的@property声明(@synthesize)

时间:2011-09-21 08:05:21

标签: objective-c properties

据我所知,@ property表示.h文件中的getter和setter,而@synthesize在.m文件中实现了getter和setter。此外,可以为getter和setter编写自己的实现,而不是使用@synthesize。

因此,如果我们总是需要实现setter / getter,为什么我们需要另外声明呢? @property似乎对我来说是语义冗余,也是bug的来源。

当我声明@property但忘记用@synthesize或手动实现它时会发生什么?当我使用@synthesize并忘记@property声明时会发生什么?

4 个答案:

答案 0 :(得分:26)

默认情况下,属性现在是合成的,因为Xcode 4.4,所以是的,你是对的,它是多余的,Apple删除了编写@property和@synthesize的需要,从现在开始只使用@property。

答案 1 :(得分:6)

在.h文件中有以下

@property (retain, nonatomic) NSString* userName;

的语法糖
-(NSString*)userName;

-(void)setUserName:(NSString*)userName;
<。>文件中的

。p中的

@synthesize是通过尊重您的属性声明中指定的retainnonatomic等来实现自己的实现的语法糖。

即使您在.h文件中指定了合适的getter,setter签名,也无法使用@property进行合成。

但是你可以离开@synthesize并实现你自己的getter和setter。

如果同时执行@synthesize和自定义getter setter,运行时会尊重您的实现并调用它。

答案 2 :(得分:4)

  

当我声明@property但忘记实现它时会发生什么   使用@synthesize还是手动?当我使用@synthesize和时,会发生什么   忘了@property声明?

你为什么不试试?如果您忘记合成访问器或提供自己的访问器,编译器将发出警告。 (如果你将它设置为将警告视为错误,这是一个好主意,则不可能错过警告。)第二种情况通常会导致编译错误。

  

因此,如果我们总是需要实现setter / getter,我们还需要这样做   另外宣布它? @property似乎是语义冗余的   我和臭虫的来源。

简而言之,@property是属性声明,@synthesize是一种可能的实现。一个属于头(=公共接口描述),另一个属于实现文件。如果不是这样,你会怎么做?

答案 3 :(得分:2)

只是想补充说你也可以使用@dynamic而不是@synthesize,尽管你很少需要这样做。 @dynamic基本上告诉编译器你以某种方式将确保在运行时对getter和setter的调用将由你自己制作或者做一些额外的事情来处理搞乱Objective C运行时的一些特殊功能。