关于C#:何时使用’self’访问属性

When to access properties with 'self'

我在本网站上阅读了很多关于这个问题的问题,我理解如下:

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

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

我的问题是基于这样一个事实:在许多例子中,self.property和property可以互换地用于不同的事物,我在确定规则时遇到了困难。Apple Docs中"配方"示例应用程序中的一个示例具有以下内容:

1
2
3
4
self.navigationItem.title = recipe.name;
nameTextField.text = recipe.name;    
overviewTextField.text = recipe.overview;    
prepTimeTextField.text = recipe.prepTime;

还有…

1
self.ingredients = sortedIngredients;

这些属性中的每一个都有相同名称的相关私有实例变量。所有属性的声明方式都与"非原子的,保留的"属性相同。每个都在DealLoc中释放…

然而,"成分"是通过self访问的,而"preptimetextfield"是直接访问的。

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

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

多谢


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

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

这通常是一个好习惯。


如果你这样申报你的财产:

1
@property (nonatomic, retain) NSMutableArray *myArray;

生成的设置程序将自动保留传入的值。这就是为什么你有时会在苹果样本代码中看到这一点:

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

"self.myarray release"是必需的,因为第一行后的保留计数是2。释放它可以确保它降到1(在应该的地方)。

如果我只是使用自动生成的setter,那么在从类内部工作时将不会使用它们。对我来说,这样做要简单得多:

1
myArray = [[NSMutableArray alloc] init];

与上面的例子相比。

我的两分钱。


视情况而定。如果您的实例变量是哑的,那么可以直接访问它们。但我们大多数人喜欢通过属性访问成员的原因是,我们可以改变该成员的逻辑,而事情仍然会起作用。

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