IOS:财产和自我

时间:2014-02-19 15:57:01

标签: ios objective-c properties self synthesize

当我宣布NSString时,我只是这样做:

NSString * my_string; (in interface of my .h)

如果我想允许从其他类访问此字符串,我会以这种方式添加属性

property (nonatomic, strong) NSString *my_string;

我写了合成

synthesize my_string; (in .m)

现在我有一些问题:

  1. 如果我使用属性,我还必须在界面中使用简单声明吗?
  2. 如果我使用my_string作为属性,我是否必须始终使用self.
  3. 如果我使用属性,是否有必要为每个属性写@synthesize? (因为我看到有时候没有必要。

3 个答案:

答案 0 :(得分:2)

  

如果我使用属性,我还必须在界面中使用简单声明吗?

不,通常你只想使用@property(它会悄悄地为你添加一个实例变量)。

  

如果我使用my_string作为属性,我必须始终使用self。前?

你不需要,但你应该。使用self.调用访问器方法来获取变量内容。不使用self.直接访问实例变量。因此,如果您将来添加自定义访问器,则需要重构。

通常,您将多次重复使用同一个变量。在这种情况下,调用self.,但使用它来设置一个局部变量,然后在整个方法中使用(这样只能调用一次访问器)。

  

如果我使用属性,是否有必要为每个属性编写@synthesize? (因为我看到有时候没有必要。

不,编译器会添加:

@synthesize propertyName = _propertyName;

对你而言,这是一个很好的方法(将属性名称与实例变量名称分开)。

答案 1 :(得分:0)

  1. NO
  2. 不,用自己。将执行访问器方法,您可以使用名称_my_string,然后您将直接访问该变量。如果您想为您的属性使用不同的变量名,那么您必须使用具有该名称的合成
  3. 不,xcode会使用名为_my_string
  4. 的变量自动合成它

答案 2 :(得分:0)

在所有情况下使用属性变得越来越合适。如果您不希望将它们公开给外部类,则可以在.m文件内的标头扩展内声明“私有”属性。假设您在.h文件中有一个名为name的属性:

@property (nonatomic, strong) NSString *name;

此类的用户可以通过在.m文件中使用theVariable.name来访问name属性,您需要使用self.name访问此属性。但是你可以这样访问ivar:

_name = @"John Smith"

这将跳过酒店并直接前往伊瓦尔。在这种情况下,如果你有一个覆盖的setter,它就不会被调用。

您不再需要合成属性。 Xcode会自动提供:

@synthesize name = _name;