-2

我是 ios 开发和 xcode 的新手。

现在我被告知在 xcode4.6 中程序员不需要使用@synthesize语句,因为 IDE 会自动为您执行。

但是我不知道为什么我的 ide 没有设置它。

@property (nonatomic,strong) NSDictionary *dictionary;

当我尝试为它设置一些东西时

dictionary = [[NSDictionary alloc]initWithContentsOfFile:resource];

它说未声明的标识符你的意思是_dictionary。不,我不是说_dictionary,我是说字典。因此,当我在实现中手动添加合成属性时,一切似乎都工作正常。

谁能告诉我这里发生了什么。

4

4 回答 4

4

该属性的基础实例变量实际上是_dictionary. 这就是自动合成属性的工作原理。

但是,您应该考虑使用访问器来设置属性(self.dictionary =改为使用)。有关这背后的原因,请参阅“在目标 c 中使用 ivars 与属性的原因”的答案


此外,请考虑将strong属性更改copy为 NSDictionary、NSArray 和 NSString 等类,以防止将可变子类(NSMutableString、NSMutableArray 或 NSMutableDictionary)分配给属性然后进行变异的错误。

于 2013-09-02T09:48:08.877 回答
2

@synthesize dictionary以前会写成@synthesize dictionary = _dictionarywhere_dictionary是与 @synthesize 生成的 getter 和 setter 相关的变量。

跳过= _variableName自 XCode 4 以来是安全的,但它会生成一个与合成属性名称匹配的变量。

dictionary在您的情况下,仅用作 setter 和 getter,如[self setDictionary:object]or [self dictionary]

如果要手动为其分配一个值,则使用_dictionary = object; 请务必了解这样做不符合 KVC。您需要通知任何观察者该值即将更改。

于 2013-09-02T09:53:52.027 回答
0

你忘了self.

self.dictionary = [[NSDictionary alloc]initWithContentsOfFile:resource];

self.dictionary调用字典对象的 setter 方法,其中 asdictionary单独尝试寻址变量,无论是函数本地还是对象的实例变量。在您的情况下,您想要解决 setter 方法。

于 2013-09-02T09:48:11.607 回答
-3

_dictionary相当于self.dictionary在 Xcode4.6

这是为了确保您正在访问同一当前类的对象。

于 2013-09-02T09:52:12.307 回答