【问题标题】:iOS: Property using super class' getter and setter not working anymore with Xcode 4.4iOS:使用超类的 getter 和 setter 的属性不再适用于 Xcode 4.4
【发布时间】:2012-08-22 05:01:51
【问题描述】:

我在引用子类的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),我不确定我是否只是做错了,或者某些与属性相关的东西在这种情况下是否发生了变化。如果有人能告诉我如何正确操作,我将不胜感激。

【问题讨论】:

  • 我猜你的第二个属性中缺少的左括号只是一个复制和粘贴错误,实际上并没有在你的代码中丢失?
  • 复制粘贴错误! ;) 非常感谢!已更正!

标签: iphone objective-c ios xcode properties


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      好的,这很有趣。

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

      我看到你决定覆盖合成的二传手......至少在技术上。尝试将方法名称更改为 setlistItems(小 L)。这样,每当您调用 self.listItems = x 时,它都会调用您的自定义设置器。

      尝试添加该合成。否则,该变量可能根本不存在。 至少在我看来。对不起,如果这不是那么有帮助。

      【讨论】:

      • setListItems 是正确的大小写。编译器足够聪明,可以处理标准的驼峰式。
      • @NoahWitherspoon 是这样吗?感谢您指出这一点,我不知道。
      猜你喜欢
      • 1970-01-01
      • 2022-06-10
      • 2012-03-12
      • 2017-06-24
      • 1970-01-01
      • 2012-04-14
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多