Objective-C,带属性的接口声明

SK9*_*SK9 4 properties interface objective-c

在以下常见样本中,

////
@interface MyObject : NSObject
{
 @public
  NSString * myString_;
}

@property (assign) NSString * myString;
@end

@implementation MyObject
@synthesize myString = myString_;
@end
////
Run Code Online (Sandbox Code Playgroud)

为什么要myString_在界面中声明?

我问,因为我们仍然可以获取和设置myString使用的实施self.myString,[self myString],self.myString = ...[self setMyString:...],事实上我们必须相反,如果它被保留.

aro*_*oth 5

这是某些人的偏好/惯例问题.默认情况下,执行:

@property (assign) NSString * myString;
Run Code Online (Sandbox Code Playgroud)

...其次是:

@synthesize myString;
Run Code Online (Sandbox Code Playgroud)

......会给你三件事.你可以作为访问的setter方法self.myString = @"newValue"或者[self setMyString:@"newValue"],可以作为访问的getter方法NSString* temp = self.myStringNSString* temp = [self myString],并命名实例变量myString是可以直接在类的内部访问(即不通过getter和setter会)和用于设置并获取属性值,并在内部使用它来支持该属性.

如果您愿意@synthesize myString = someOtherVarName,您仍然可以像以前一样获得setter和getter,但是myString实例变量不是实例变量,而是someOtherVarName用于备份属性,并且不会myString创建任何变量.

那么为什么要使用更详细的语法呢?从未有一个需要你这样做,但有些人喜欢这样做与被声明的属性打交道时,任何情况下,retaincopy.这样做的原因是设置声明的属性retaincopy通过其生成的setter方法将影响正在设置/取消设置的对象的保留计数.通过直接访问实例变量来做同样的事情不会.

因此,通过将实例变量别名化为其他内容,您可以在代码中区分"任何xxx.myString = Y正在修改保留计数的内容,而不执行任何操作someOtherVarName = Y".同样,没有必要这样做,但有些人更喜欢这样做.