2

如果我在 Objective-C 2.0 中定义一个属性如下:

@property (readwrite, assign) NSObject *theObject;

我必须以某种方式创建 getter 和 setter 方法。据我所知,对此我有三个选择。

  • 手动编码- (NSObject *)theObject&的实现- (void)setTheObject:(NSObject *)object
  • 用于@synthesize自动生成这两种方法,或
  • 用于@dynamic自动生成我没有选择覆盖的两种方法中的任何一种。

我是否正确理解这一点?此外,不同参数的使用如何@property影响@synthesize&的结果@dynamic?(例如,nonatomic& weak

4

2 回答 2

2

@synthesize您误解了和之间的区别@dynamic

@synthesize如果尚未手动实现 getter 和/或 setter,则将生成属性的 getter 和 setter 方法。这就是你目前所相信@dynamic的。

@dynamic当您不希望运行时自动生成 getter 和 setter 并且您没有手动实现它们时使用。基本上,@dynamic告诉编译器 getter/setter 将在运行时使用某种运行时魔法动态提供。

例如,Objective-C 运行时编程指南说:

You can implement the methods `resolveInstanceMethod:` and `resolveClassMethod:` 
to dynamically provide an implementation for a given selector for an instance 
and class method respectively.

我建议您阅读The Objective-C Programming Language 的Declared Properties部分,因为它更详细地解释了方法,并与所有属性(如和)一起工作。@property@synthesize@dynamicnonatomicweak

于 2012-07-20T03:10:54.880 回答
2

@dynamic告诉编译器访问器方法是在运行时提供的。

通过一些调查,我发现提供访问器方法会覆盖@dynamic指令。

@synthesize告诉编译器为你创建这些访问器(getter 和 setter)

@property告诉编译器将创建访问器,并且可以使用点符号或[object message]

于 2015-06-05T08:25:22.233 回答