所以这就是我对Objective-C中属性的了解。如果这些不是事实,请纠正我。
我对属性的所有知识都与实例变量相结合。我最近看了一些视频,说除了setter / getters之外,还可以使用其他实例方法。
这是真的吗?如果是这样,您将如何以及为何以这种方式使用房产?例如,我正在观看有关协议的斯坦福cs193p视频,它说你可以在协议中有一个原型。我可能会误解。
无论如何感谢那些回复
的人答案 0 :(得分:2)
声明属性时,您声明了实例变量的setter / getter
不,你是在宣布一个吸气者,也可能是一个属性的设定者。期。声明属性本身并不意味着实例变量。实现属性的方法有很多种。实例变量恰好是一种常见且流行的方式,但非ivar属性非常常见。
如果你想定义setter和getter,你需要合成它们
No。(正如塞尔吉奥指出的那样,我最初混淆了“已定义”和“已声明”。)几乎。 @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
这两者之间存在一些非常小的差异,一些与运行时有关,一些与编译器有关,但如果你假装它们是相同的则更清楚。
你在这两种情况下所做的只是声明一些方法。您没有宣布它们是如何实施的。你没有宣布伊娃。你只是声明方法。您现在可以自由地以任何方式实现这些方法。如果您愿意,可以通过让编译器为您合成一些默认实现来实现它们。如果您愿意,可以手动实施。如果你愿意,你可以做其中一个。
答案 1 :(得分:0)
使用属性作为无参数方法会将它们扭曲成它们不是的东西。