Objective c 何时使用';自我';

Objective c 何时使用';自我';,objective-c,properties,retain,self,Objective C,Properties,Retain,Self,我在本网站上阅读了许多关于此问题的问题,我了解以下内容: self.navigationItem.title = recipe.name; nameTextField.text = recipe.name; overviewTextField.text = recipe.overview; prepTimeTextField.text = recipe.prepTime; property访问手动或@synthesis创建的getter/setter方法。根据属性是否声明为保

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

self.navigationItem.title = recipe.name;
nameTextField.text = recipe.name;    
overviewTextField.text = recipe.overview;    
prepTimeTextField.text = recipe.prepTime; 
property访问手动或@synthesis创建的getter/setter方法。根据属性是否声明为保留、复制等。保留计数已正确修改,例如保留的属性,释放先前分配给新值的值,并将保留计数增加1

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

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

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

self.ingredients = sortedIngredients;
每个属性都有同名的关联私有实例变量。所有属性都以“非原子,保留”属性的相同方式声明。每一个都在dealloc中发布

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

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

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


非常感谢

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


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

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

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


这通常是一个好习惯。

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

@property (nonatomic, retain) NSMutableArray *myArray;
生成的setter将自动保留传入的值。这就是为什么您有时会在Apple示例代码中看到这一点:

self.myArray= [[NSMutableArray alloc] init]:
[self.myArray release];
“[self.myArray release]”是必需的,因为保留计数在第一行后两行。释放它可以确保它降到1(应该在的位置)

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

myArray = [[NSMutableArray alloc] init];
与上面的例子相比


我的两分钱。

在dealloc类中,我应该使用[self.property release]还是仅仅使用[iVar release]?两者都完成相同的任务。您甚至可以执行self.property=nil,因为自动生成的setter将在将其设置为nil之前释放旧的赋值。我个人的偏好是再次使用[iVar release],但没有技术上的原因。