声明属性时,您正在声明实例变量的 setter/getter
不,您正在声明一个 getter 并且可能是一个属性的 setter。时期。声明一个属性本身并不意味着一个实例变量。有很多方法可以实现属性。实例变量恰好是一种常见且流行的方式,但非 ivar 属性非常常见。
如果你想定义 setter 和 getter,你需要合成它们
不。(正如塞尔吉奥指出的那样,我最初混淆了“定义”和“声明”。)几乎。该@property
行本身声明了 setter 和 getter。如果您想为您实现setter 和 getter ,这称为“合成”,但您不再需要手动执行此操作。编译器将为您声明但未实现的任何属性自动创建 getter 和 setter(除非您明确要求它不要使用@dynamic
)。
如果您进行综合,则会为您定义实例变量。最佳做法是重命名 iVar,使 getter 和 iVar 的名称不同。所以你通常会这样做:@synthesize myVar = _myVar
几乎。几个月前确实如此,但您不再需要实际这样做@synthesize
。它现在将由编译器自动为您完成。
这个标题:
@interface MyObject : NSObject
@property (nonatomic, readwrite, strong) NSString *something;
@end
与此标头几乎相同:
@interface MyObject : NSObject
- (NSString *)something;
- (void)setSomething:(NSString *)something;
@end
这两者之间有一些非常小的差异,一些与运行时有关,一些与编译器有关,但如果你只是假装它们是相同的,那就更清楚了。
在这两种情况下,您所做的只是声明一些方法。您没有声明它们是如何实现的。你不是在声明 ivars。你只是在声明方法。您现在可以自由地以您喜欢的任何方式实现这些方法。如果您愿意,您可以通过让编译器为您合成一些默认实现来实现它们。如果你愿意,你可以手动实现它们。如果你愿意,你可以做一个。