9

所以属性的自动合成很棒。但是,当您同时提供 getter 和 setter 时,会出现错误。

@property (strong, nonatomic) NSArray *testArray;

- (NSArray *)testArray {
    return _testArray;
}

- (void)setTestArray:(NSArray *)testArray {
    _testArray = testArray;
}

错误:Use of undeclared identifier '_testArray'

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

4

3 回答 3

8

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

一旦缺少其中一个,就需要 ivar 来合成该功能。

如果我没记错的话,对于只读属性,模拟假设也成立。

于 2012-10-16T15:44:37.520 回答
8

在最新的编译器/运行时下,当您使用

@synthesize testArray = _testArray;

编译器创建

  • 一个_testArrayivar,如果它不存在;
  • 一个testArray方法,如果你还没有实现它;
  • 一个setTestArray:方法,如果你还没有实现它。

如果你使用

@synthesize testArray;

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

如果您不使用@synthesize,并且依赖自动合成,_testArray则仅在(两者都必须应用)时创建 ivar

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

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

于 2012-10-16T15:56:16.130 回答
-1

我做了一些测试:

在最近的 Objective-c 约定下,您不需要综合属性。

如果你这样做

@property (strong, nonatomic) Business* theBiz;

iOs 会自动创建一个名为 _theBiz 的私有 ivar 变量;

如果您只实现一个 getter 或一个 setter,它似乎工作得很好:

-(void)setTheBiz:(Business *)theBiz
{
    _theBiz = theBiz;
}

但是,如果您声明 BOTH,即使其中之一只是空函数,您也会收到编译错误。

-(void)setTheBiz:(Business *)theBiz
{
    _theBiz = theBiz;
}

-(Business *) theBiz
{

}

当你同时实现 getter 和 setter 时,你会得到一个编译错误,说没有 _theBiz 这样的东西。

通过添加以下内容可以轻松解决此问题:

@synthesize theBiz = _theBiz;

但这破坏了Objective-c这个令人敬畏的新特性的全部意义。

我想知道这是设计使然还是我只是遗漏了一些东西。苹果的东西是什么?

我最好的猜测是这是一个错误。

纪尧姆的回答没有解决这个事实。

他说过

至少已经合成了一种方法

如果只设置了 getter 或 setter 之一,似乎就会创建 _theBiz 。当两者都设置时,它不再被创建,这一定是一个错误。事实上,根本不需要设置任何变量,仍然会创建 ivar。

解决这个问题的唯一方法是明确地做

@synthesize theBiz = _theBiz;
于 2012-10-19T08:59:14.733 回答