0

在引用子类中的 getter 和 setter 时,我遇到了属性问题:

在基类中,我有一个名为 listItems 的属性,带有一个自定义设置器:

@interface BaseList{
    NSArray *_listItems;
}
@property (nonatomic, retain) NSArray *listItems;
@end

@implementation BaseList
@synthesize listItems = _listItems;

-(void)setListItems:(NSArray *)listItems
{
    [_listItems release];
    _listItems = [listItems retain];
    //... some logic
}
@end

子类有一个属性,该属性具有更具体的 listItems 名称,例如地址:

@interface AddressList
@property (nonatomic, retain, getter = listItems, setter = setListItems:) NSArray *addresses;
@end

AddressList 的实现中没有合成addresses 属性,因为它应该使用super 的listItems 属性的getter 和setter。但是,设置后:

self.addresses = [NSArray array];

财产仍然为零。有趣的是,我相信这适用于早期版本的 Xcode。我目前正在使用 Xcode 4.4 (4.4.1),我不确定我是否只是做错了,或者某些与属性相关的东西在这种情况下是否发生了变化。如果有人能告诉我如何正确地做到这一点,我将不胜感激。

4

3 回答 3

3

Apple 改变了在 Xcode 4.4 中合成访问器的方式。您不再需要声明 ivar,也无需合成访问器。当然,您仍然可以声明自己的 ivars 和合成器,但既然您不这样做,编译器就会为您做这件事。

您可以改为使用@dynamic来抑制这种情况。

您可以在 Build Settings 中打开一个名为Implicit Synthesized Properties的警告。打开它以暂时获得有关为您合成的所有访问器的警告。

从 Xcode 4.4 开始,Apple LLVM 编译器将隐式合成未使用 @synthesize 显式合成的属性。此警告警告此类隐式行为,即使该属性仍是合成的。这本质上是一个向后兼容性警告,或者对于那些希望继续明确使用@synthesize 的人。

于 2012-08-27T17:34:54.347 回答
2

In your AddressList implementation, add @dynamic addresses;. This will make it so xcode doesn't automatically generate anything for you anymore. Right now Xcode is generating -listItems and setListItems: methods that refer to an auto-generated instance variable _addresses.

于 2012-08-27T17:30:57.787 回答
0

Okay, this is interesting.

First off, remove the ivar _listItems from your declaration of BaseList. synthesize creates that ivar for you, possibly causing a duplicate name error.

I see you decided to override the synthesized setter...technically at least. Try to change the method name to setlistItems (small L). That way, whenever you call self.listItems = x, it will call your custom setter.

Try adding that synthesize. Otherwise, the variable might as well not exist at all. In my opinion at least. Sorry if that isn't that helpful.

于 2012-08-27T17:30:37.647 回答