在从子类中引用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名称的属性,例如addresses:
@interface AddressList
@property (nonatomic, retain, getter = listItems, setter = setListItems:) NSArray *addresses;
@endaddresses属性不会在AddressList的实现中合成,因为它应该使用超级的listItems属性的getter和setter。但是,在设置之后:
self.addresses = [NSArray array];该属性仍然为空。有趣的是,我相信这在早期版本的Xcode中工作得很好。我目前使用的是Xcode4.4 (4.4.1),我不确定是我做错了,还是在这个上下文中一些与属性相关的东西发生了变化。如果有人能告诉我如何正确地做它,我将非常感激。
发布于 2012-08-28 01:34:54
Apple改变了在Xcode4.4中合成访问器的方式。你不再需要声明一个ivar,你也不需要合成访问器。当然,你仍然可以声明你自己的ivar和synthesizors,但是既然你没有这样做,编译器就会为你做这件事。
您可以通过使用@dynamic来抑制这一点。
有一个名为隐式合成属性的警告,您可以在构建设置中启用该警告。打开该选项可以暂时获得有关为您合成的所有访问器的警告。
从Xcode4.4开始,Apple LLVM编译器将隐式合成未使用@synthesize显式合成的属性。此警告对此类隐式行为发出警告,即使该属性仍处于合成状态。这本质上是一个向后兼容性警告,或者对于那些希望继续显式使用@synthesie.
的人来说
发布于 2012-08-28 01:30:58
在您的AddressList实现中,添加@dynamic addresses;。这将使xcode不再自动为您生成任何内容。现在,Xcode正在生成引用自动生成的实例变量_addresses的-listItems和setListItems:方法。
发布于 2012-08-28 01:30:38
好吧,这很有趣。
首先,从BaseList声明中删除ivar _listItems。synthesize会为您创建该ivar,可能会导致重复的名称错误。
我知道你至少决定覆盖合成的setter...technically。尝试将方法名称更改为setlistItems (小写L)。这样,每当您调用self.listItems = x时,它都会调用您的自定义设置器。
试着加那个合成器。否则,该变量可能根本不存在。至少在我看来是这样。抱歉,如果这不是那么有用的话。
https://stackoverflow.com/questions/12146530
复制相似问题