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

Objective c 在类扩展中重新声明只读属性,objective-c,objective-c-category,Objective C,Objective C Category,我阅读本文件是为了学习objective-C: 我在主题“使用类扩展隐藏私人信息”(pdf第73页)中提到: 类扩展通常用于使用附加的私有方法或属性来扩展公共接口,以便在类本身的实现中使用。例如,通常在接口中将属性定义为只读,但在实现上方声明的类扩展中将属性定义为读写,以便类的内部方法可以直接更改属性值。 我在这条语句中不理解的是,因为我们可以在类扩展中定义的任何私有方法中更改readonly属性,而不必在类扩展中将该属性重新声明为readwrite,通过将该属性重新声明为readwrite,它

我阅读本文件是为了学习objective-C:

我在主题“使用类扩展隐藏私人信息”(pdf第73页)中提到:
类扩展通常用于使用附加的私有方法或属性来扩展公共接口,以便在类本身的实现中使用。例如,通常在接口中将属性定义为只读,但在实现上方声明的类扩展中将属性定义为读写,以便类的内部方法可以直接更改属性值。


我在这条语句中不理解的是,因为我们可以在类扩展中定义的任何私有方法中更改readonly属性,而不必在类扩展中将该属性重新声明为readwrite,通过将该属性重新声明为readwrite,它实现了什么?

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

  • 实际上,我的假设“我们可以从类扩展中定义的任何私有方法中更改只读属性”是错误的。类扩展无法为给定的只读属性使用自动合成的实例变量,因为它们在默认情况下是私有的(不受保护)
  • 尽管我提到的文档说,为给定属性自动合成的实例变量前面有一个前导下划线(
    \u Make
    )。事实并非如此(至少在Xcode 4.6.3中并非如此)。它具有相同的名称并具有属性本身(除非您合成实例变量本身
    @synthesis Make=\u Make;
    如果我错了,请纠正我

  • 我有一个类似于
    @property(readonly)NSString*Make;
    的属性,我可以通过这个实例方法简单地更改它:
    -(void)setMyMake:(NSString*)myMake{Make=myMake;}
    。我甚至不需要
    \u ivar
    。那么为什么我不能在所有私有类扩展方法中始终使用
    Make=myMake;
    ?为什么我需要做
    self.Make=myMake;
    ?我也不确定
    \u Make=myMake;
    为什么说
    \u Make
    是一个未声明的标识符。我正在合成
    Make
    pro通过使用self.myvar=newvar,您使用的是自动生成的代码,它还会自动处理所有内存管理人员,尤其是在设置新值时,这些人员会被考虑在内。此外,它是一个未声明的标识符,因为您可能没有使用扩展重新声明为readwrite(只是猜测而已)。