何时使用 'self' 访问属性

7
我已经阅读了该网站上关于此问题的若干个问题,我了解以下内容:
self.property 访问手动或@synthesie创建的getter/setter方法。根据属性是否声明为retain、copy等,将正确修改保留计数,例如保留属性使用'retain'将先前分配的值释放并将其新值引用次数增加1。
通常,属性与同名的实例变量(如果手动赋值可以不同)一起声明。这通常是因为@synthesize生成的访问器使用实例变量引用内存中的对象,然后执行相关命令。
我的问题基于这样一个事实,即在许多示例中,self.property和property可用于不同的东西,并且我难以确定规则。苹果文档中的“Recipes”示例应用程序中有一个示例,其中包含以下内容:
self.navigationItem.title = recipe.name;
nameTextField.text = recipe.name;    
overviewTextField.text = recipe.overview;    
prepTimeTextField.text = recipe.prepTime; 

并且...

self.ingredients = sortedIngredients;

每个属性都有与之相关的同名私有实例变量。它们都使用“nonatomic,retain”属性以相同的方式声明。在dealloc中释放每个变量...
然而,“ingredients”是通过self访问的,“prepTimeTextField”是直接访问的。
访问方法不同的原因是什么?
如果我正在访问视图的代理呢?或者一个通过其前一个视图控制器作为保留属性传递给视图控制器的核心数据对象?
非常感谢。
3个回答

2

几乎总是希望使用合成的setter/getter访问变量,即使此刻没有任何特殊处理。

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

这通常是一个好习惯。


1
如果您这样声明您的属性:
@property (nonatomic, retain) NSMutableArray *myArray;

生成的setter将自动保留传入的值。这就是为什么你有时会在苹果示例代码中看到这个:
self.myArray= [[NSMutableArray alloc] init]:
[self.myArray release];

"[self.myArray release]"是必须的,因为在第一行后保留计数为2。释放它可以确保其降至1(应该是这样)。
如果我只是使用自动生成的setter,在类内部工作时不会使用它们。对我来说,这只是更简单的方法:
myArray = [[NSMutableArray alloc] init];

与上面的例子相比。

我的个人看法。


在dealloc类中,我应该使用[self.property release]还是只用[iVar release]? - Glynton
两种方法都能达到同样的效果。你甚至可以使用 self.property=nil,因为自动生成的 setter 会在将其设置为 nil 之前释放旧的赋值。我个人更喜欢使用 [iVar release],但没有技术上的原因。 - please delete me

0

这要看情况。如果你的实例变量很简单,直接访问它们是可以的。但我们大多数人喜欢通过属性来访问成员的原因是,我们可以更改该成员的逻辑,而事情仍然可以正常工作。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接