在类扩展中重新声明只读属性

Posted

技术标签:

【中文标题】在类扩展中重新声明只读属性【英文标题】:re-declaring readonly property in class extensions 【发布时间】:2013-07-24 07:58:36 【问题描述】:

我正在阅读这篇文档来学习objective-C:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/CustomizingExistingClasses/CustomizingExistingClasses.html#//apple_ref/doc/uid/TP40011210-CH6-SW1

我的主题“使用类扩展隐藏私人信息”(pdf第73页)它说: Class extensions are often used to extend the public interface with additional private methods or properties for use within the implementation of the class itself. It’s common, for example, to define a property as readonly in the interface, but as readwrite in a class extension declared above the implementation, in order that the internal methods of the class can change the property value directly.

我在这个声明中不明白的是,由于我们可以在类扩展中定义的任何私有方法中更改只读属性,而无需在类扩展中将该属性重新声明为读写,那么通过重新声明那个属性是可读写的?

【问题讨论】:

【参考方案1】:

您始终可以通过其实例变量 (_ivar = ...) 更改属性,但您将无法使用点属性语法 (self.myProp =...) 更改它,除非您将其重新声明为 readwrite。在这种情况下,您还需要提供其他信息,例如该属性是 strong 还是 weak

【讨论】:

我有一个像@property (readonly) NSString * Make; 这样的属性。我可以通过这个实例方法简单地改变它:- (void) setMyMake : (NSString *) myMake Make = myMake; 。我什至不需要_ivar。那么为什么我不能在所有私有类扩展方法中总是使用Make = myMake; 呢?为什么我需要self.Make = myMake; 我也不确定为什么_Make = myMake;_Make 是一个未声明的标识符。我正在我的实现中综合Make 属性。 通过使用 self.myvar=newvar 您正在使用自动生成的代码,它也会自动处理所有内存管理人员,尤其是在您设置新值时会考虑到这一点。它也是一个未声明的标识符,因为您可能没有使用重新声明为读写的扩展(只是猜测)。【参考方案2】:
    实际上,我认为“我们可以从类扩展中定义的任何私有方法中更改只读属性”的假设是错误的。类扩展不能为给定的只读属性使用自动合成的实例变量,因为它们默认是私有的(不受保护)。 尽管我提到的文档说为给定属性自动合成的实例变量前面有一个前导下划线 (_Make)。这实际上不是真的(至少在 Xcode 4.6.3 中不是)。它具有相同的名称具有属性本身(除非您合成实例变量本身@synthesize Make = _Make; 如果我错了,请纠正我

【讨论】:

以上是关于在类扩展中重新声明只读属性的主要内容,如果未能解决你的问题,请参考以下文章

python属性重新赋值叫啥

避免在类头文件中声明私有函数 (C++)

为什么为 const 变量重新赋值不是个静态错误

Python 的类里面给属性重新赋值用了啥方法?

锁定关键文件,增强Linux安全性

AD B2C - 重新获取令牌后缺少自定义声明