Objective-C:了解属性

时间:2013-01-15 14:42:14

标签: objective-c

所以这就是我对Objective-C中属性的了解。如果这些不是事实,请纠正我。

  1. 声明属性时,您声明了实例变量
  2. 的setter / getter
  3. 如果您想要定义setter和getter,则需要合成它们
  4. 如果您合成,则为您定义实例变量。最佳做法是重命名iVar,以使getter和iVar名称不同。所以你通常这样做: @synthesize myVar = _myVar
  5. 我对属性的所有知识都与实例变量相结合。我最近看了一些视频,说除了setter / getters之外,还可以使用其他实例方法。

    这是真的吗?如果是这样,您将如何以及为何以这种方式使用房产?例如,我正在观看有关协议的斯坦福cs193p视频,它说你可以在协议中有一个原型。我可能会误解。

    无论如何感谢那些回复

    的人

2 个答案:

答案 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)

使用属性作为无参数方法会将它们扭曲成它们不是的东西。