7

我已在本网站上阅读了有关此问题的许多问题,我了解以下内容:

self.property 访问手动或@synthesize 创建的getter/setter 方法。根据是否将属性声明为保留、复制等,保留计数被正确修改,例如保留属性,释放先前的值,并使用“保留”将新值分配给新值,并将保留计数增加 1。

属性通常使用同名的实例变量来声明(如果您手动进行分配,可能会有所不同)。这一般是因为@synthesize 生成的访问器使用实例变量来引用内存中的对象,然后执行相关命令。

我的问题是基于这样一个事实,即在许多示例中, self.property 和 property 可互换用于不同的事物,并且我在确定规则时遇到了麻烦。Apple Docs 中的“食谱”示例应用程序中的一个示例具有以下内容:

self.navigationItem.title = recipe.name;
nameTextField.text = recipe.name;    
overviewTextField.text = recipe.overview;    
prepTimeTextField.text = recipe.prepTime; 

和...

self.ingredients = sortedIngredients;

这些属性中的每一个都具有关联的同名私有实例变量。所有都以相同的方式声明为“非原子,保留”属性。每个都在 dealloc 中释放...

然而,“成分”是通过 self 访问的,而“prepTimeTextField”是直接访问的。

访问方法不同的原因是什么?

如果我正在访问视图的委托怎么办?或者是一个核心数据对象,它作为保留属性由之前的视图控制器传递给视图控制器?

非常感谢

4

3 回答 3

2

您几乎总是希望使用合成的 setter/getter 访问变量,即使您目前没有对它们做任何特别的事情。

如果随着您的应用程序的开发,您发现需要对变量进行进一步的验证/格式化,那么您只需实现所需的 setter/getter 方法,如果您使用了合成方法,则此代码将被调用。

这通常是一个好习惯。

于 2010-11-24T21:52:57.110 回答
1

如果您像这样声明您的财产:

@property (nonatomic, retain) NSMutableArray *myArray;

生成的 setter 将自动保留传入的值。这就是为什么您有时会在 Apple 示例代码中看到这一点:

self.myArray= [[NSMutableArray alloc] init]:
[self.myArray release];

"[self.myArray release]" 是必需的,因为保留计数在第一行之后是两个。释放它可以确保它下降到 1(它应该在哪里)。

如果我只是使用自动生成的设置器,那么在课堂内部工作时我不会使用它们。这对我来说要简单得多:

myArray = [[NSMutableArray alloc] init];

与上面的示例相比。

我的两分钱。

于 2010-11-25T00:14:42.340 回答
0

依靠。如果您的实例变量是愚蠢的,那么直接访问它们就可以了。但是我们大多数人喜欢通过属性访问成员的原因是我们可以更改该成员的逻辑,并且事情仍然可以工作。

例如,有时您会想要更改一个类以延迟加载某些内容,而不是立即加载。如果您已经在使用属性来访问您的实例变量,那么您只需编辑访问器方法,一切都应该正常工作。

于 2010-11-24T21:24:35.963 回答