当我提供getter和setter时,为什么需要编写@synthesize?

Kev*_*ers 8 properties objective-c synthesize

因此自动合成属性非常棒.但是,当您同时提供getter和setter时,会出现错误.

@property (strong, nonatomic) NSArray *testArray;

- (NSArray *)testArray {
    return _testArray;
}

- (void)setTestArray:(NSArray *)testArray {
    _testArray = testArray;
}
Run Code Online (Sandbox Code Playgroud)

错误:Use of undeclared identifier '_testArray'.

添加@synthesize testArray = _testArray;解决了问题.我只是想知道为什么会这样?

Eik*_*iko 8

当您同时提供getter和setter时,通常根本不需要实例变量,即只需转发这些消息或将数据存储在其他位置.

只要其中一个缺失,就需要使用ivar来合成该功能.

如果我没记错的话,对于只读属性,模拟假设也是如此.


Gui*_*ume 8

在最近的编译器/运行时,在您使用时

@synthesize testArray = _testArray;
Run Code Online (Sandbox Code Playgroud)

编译器创建

  • 一个_testArray实例变量,如果它不已经存在;
  • 一种testArray方法,如果你还没有实现它;
  • 一个setTestArray:方法,如果你还没有实现它.

如果你使用

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

testArray如果它不存在,编译器会创建一个ivar,而不是_testArray.

如果你不使用@synthesize,并依赖于自动合成,_testArray只有在(两者都必须适用)时才会创建ivar

  • _testArray 不存在;
  • 已经合成了至少一种方法(getter for readonly,getter和/或setter for readwrite).

在您的示例中,您已实现了所有方法,因此自动合成不会合成任何方法,因此它不会创建ivar.您可以_testArray自己声明ivar,也可以像使用的那样使用显式合成.