据我所知,@ property表示.h文件中的getter和setter,而@synthesize在.m文件中实现了getter和setter。此外,可以为getter和setter编写自己的实现,而不是使用@synthesize。
因此,如果我们总是需要实现setter / getter,为什么我们需要另外声明呢? @property似乎对我来说是语义冗余,也是bug的来源。
当我声明@property但忘记用@synthesize或手动实现它时会发生什么?当我使用@synthesize并忘记@property声明时会发生什么?
答案 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
是通过尊重您的属性声明中指定的retain
,nonatomic
等来实现自己的实现的语法糖。
即使您在.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运行时的一些特殊功能。