0

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

  1. 声明属性时,您正在声明实例变量的 setter/getter
  2. 如果你想定义 setter 和 getter,你需要合成它们
  3. 如果您进行综合,则会为您定义实例变量。最佳做法是重命名 iVar,使 getter 和 iVar 的名称不同。所以你通常会这样做:@synthesize myVar = _myVar

我所有关于属性的知识都与实例变量相结合。我最近看了一些视频,说属性可以用于除了 setter/getter 之外的其他实例方法。

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

无论如何感谢那些回复的人

4

3 回答 3

2

声明属性时,您正在声明实例变量的 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。你只是在声明方法。您现在可以自由地以您喜欢的任何方式实现这些方法。如果您愿意,您可以通过让编译器为您合成一些默认实现来实现它们。如果你愿意,你可以手动实现它们。如果你愿意,你可以做一个。

于 2013-01-15T14:53:53.773 回答
1

自 Xcode 4.4 起,属性默认合成。所以你只需要声明属性(myVar)。还有一个可用的 _myVar,您可以使用它来代替访问 self.myVar。

于 2013-01-15T14:48:47.027 回答
0

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

于 2013-01-15T15:16:40.783 回答