-2

当我声明一个时,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为每个都写?(因为我看到有时没有必要。
4

3 回答 3

2

如果我使用一个属性,我是否也必须使用接口中的简单声明?

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

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

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

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

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

不,编译器会添加:

@synthesize propertyName = _propertyName;

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

于 2014-02-19T16:03:27.340 回答
0
  1. 不,使用自我。将执行访问器方法,您可以将其与名称 _my_string 一起使用,然后您将直接访问该变量。如果您想为您的属性使用不同的变量名称,那么您必须使用带有该名称的 synthetize
  2. NO,xcode 会用名为 _my_string 的变量自动合成它
于 2014-02-19T16:01:42.753 回答
0

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

@property (nonatomic, strong) NSString *name;

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

_name = @"John Smith"

这将跳过该属性并直接转到 ivar。在这种情况下,如果您有一个覆盖的设置器,它将不会被调用。

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

@synthesize name = _name;
于 2014-02-19T16:02:35.053 回答