首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >iOS:使用超类的getter和setter的属性不再适用于Xcode4.4

iOS:使用超类的getter和setter的属性不再适用于Xcode4.4
EN

Stack Overflow用户
提问于 2012-08-28 01:21:53
回答 3查看 1.7K关注 0票数 0

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

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

代码语言:javascript
复制
@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:

代码语言:javascript
复制
@interface AddressList
@property (nonatomic, retain, getter = listItems, setter = setListItems:) NSArray *addresses;
@end

addresses属性不会在AddressList的实现中合成,因为它应该使用超级的listItems属性的getter和setter。但是,在设置之后:

代码语言:javascript
复制
self.addresses = [NSArray array];

该属性仍然为空。有趣的是,我相信这在早期版本的Xcode中工作得很好。我目前使用的是Xcode4.4 (4.4.1),我不确定是我做错了,还是在这个上下文中一些与属性相关的东西发生了变化。如果有人能告诉我如何正确地做它,我将非常感激。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-08-28 01:34:54

Apple改变了在Xcode4.4中合成访问器的方式。你不再需要声明一个ivar,你也不需要合成访问器。当然,你仍然可以声明你自己的ivar和synthesizors,但是既然你没有这样做,编译器就会为你做这件事。

您可以通过使用@dynamic来抑制这一点。

有一个名为隐式合成属性的警告,您可以在构建设置中启用该警告。打开该选项可以暂时获得有关为您合成的所有访问器的警告。

从Xcode4.4开始,Apple LLVM编译器将隐式合成未使用@synthesize显式合成的属性。此警告对此类隐式行为发出警告,即使该属性仍处于合成状态。这本质上是一个向后兼容性警告,或者对于那些希望继续显式使用@synthesie.

的人来说

票数 3
EN

Stack Overflow用户

发布于 2012-08-28 01:30:58

在您的AddressList实现中,添加@dynamic addresses;。这将使xcode不再自动为您生成任何内容。现在,Xcode正在生成引用自动生成的实例变量_addresses-listItemssetListItems:方法。

票数 2
EN

Stack Overflow用户

发布于 2012-08-28 01:30:38

好吧,这很有趣。

首先,从BaseList声明中删除ivar _listItems。synthesize会为您创建该ivar,可能会导致重复的名称错误。

我知道你至少决定覆盖合成的setter...technically。尝试将方法名称更改为setlistItems (小写L)。这样,每当您调用self.listItems = x时,它都会调用您的自定义设置器。

试着加那个合成器。否则,该变量可能根本不存在。至少在我看来是这样。抱歉,如果这不是那么有用的话。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12146530

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档