【问题标题】:Custom or override accessor with property使用属性自定义或覆盖访问器
【发布时间】:2014-03-13 06:02:59
【问题描述】:

两个相似的问题

问题 1:我有一个名为 mySetter: 的自定义 setter,stockName 是否仍然持有强指针?

@property (nonatomic, strong, setter = mySetter:) NSString *stockName;
- (void)mySetter:(NSString *)name {
    _stockName = name;
}

问题 2:我已经覆盖了默认设置器,stockName 是否仍然持有强指针?

@property (nonatomic, strong) NSString *stockName;
- (void)setStockName:(NSString *)stockName {
    _stockName = stockName;
}

感谢回复

【问题讨论】:

  • 是的。这些都是相同的,您只是将属性名称别名为其他名称。
  • 第二种情况如何覆盖默认设置器? stockName 的默认设置器为 setStockName:。 mySetter:,在这种情况下,只是你需要调用的一个方法。
  • 哦对不起,写错代码了,我去修改

标签: ios objective-c accessor


【解决方案1】:

来自Encapsulating Data 在“使用 Objective-C 编程”中:

注意:编译器会自动合成一个实例变量 在它还合成至少一个访问器的所有情况下 方法。如果您为读写实现了 getter 和 setter 属性或只读属性的 getter,编译器将 假设您正在控制属性实现 并且不会自动合成实例变量。

由于您没有实现 getter,因此会合成实例变量 _stockName。 为此,如果您使用设置器的默认名称或自定义名称,则无关紧要。

并且将属性声明为“强”意味着 __strong 拥有 关联的实例变量,见"4.1.1. Property declarations" 在“Clang/ARC”文档中。

【讨论】:

    【解决方案2】:

    如果您使用ARC 并指定strong 访问说明符,则属性将持有强引用。 ARC 将进行保留/释放。在non arc 下覆盖访问器方法不是这样的。您应该处理retain/release。通过setter = mySetter:,您只是为访问器方法分配了一个别名。这不会对实施产生任何影响。两种方法都在做同样的事情。还有一件事mySetter: 不会成为stockName 的设置者,而是setStockName

    【讨论】:

      【解决方案3】:

      stockName 将持有strong 指针,因为您正在为property 提供strong 所有权。所以在这两种情况下,你都会得到一个strong 指针引用。

      但是对于您提出的问题,您可以使用stockName 作为iVar、setter 方法和getter 方法作为

      问题 1

      iVar = stockName

      getter = [self stockName] 或 self.stockName

      setter = [self mySetter:]

      问题 2

      iVar = stockName

      getter = [self stockName] 或 self.stockName

      setter = self.stockName = 或 [self setStockName:]

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-03-12
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-05-08
        • 2014-08-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多