在类扩展中重新声明只读属性
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;
如果我错了,请纠正我
【讨论】:
以上是关于在类扩展中重新声明只读属性的主要内容,如果未能解决你的问题,请参考以下文章