这不是要解决任何特定问题,只是想了解Objc中属性的细微差别。
说我有一个班老兄
@interface Dude:NSObject
@property(只读,……
在Apple中 Objective-C编程语言 ,他们用财产的重新声明作为例子描述了“扩张”如下:
扩展 类扩展类似于匿名类,除了它们声明的方法必须在main中实现 @implementation 阻止相应的类。使用Clang / LLVM 2.0编译器,您还可以在类扩展中声明属性和实例变量。 类扩展的一个常见用途是重新声明以readwrite形式公开声明为私有的属性: @interface MyClass : NSObject @property (retain, readonly) float value; @end // Private extension, typically hidden in the main implementation file. @interface MyClass () @property (retain, readwrite) float value; @end ...
类扩展类似于匿名类,除了它们声明的方法必须在main中实现 @implementation 阻止相应的类。使用Clang / LLVM 2.0编译器,您还可以在类扩展中声明属性和实例变量。
@implementation
类扩展的一个常见用途是重新声明以readwrite形式公开声明为私有的属性:
@interface MyClass : NSObject @property (retain, readonly) float value; @end // Private extension, typically hidden in the main implementation file. @interface MyClass () @property (retain, readwrite) float value; @end
...
因此,如此处所示,这种模式是“edeclare”属性。不过,这是相同的财产。当您希望编译器合成私有setter时,即使声明了公共接口,也只需重新声明属性 readonly 。如果你不重新宣布该财产 readwrite 在扩展中,根本不会合成一个setter。
readonly
readwrite
您的各种警告实际上说明了我们处理相同财产的事实,因为这仅仅是您重新申报的性质与公共界面中包含的内容不兼容的示例。
您可以将其视为公共和私有界面。
.h文件中声明的接口是您的类的公共接口。 所以,如果你有理由只读一个属性,那就有意义了。
.m文件中的无名类别(Dude())是您在属性上的私人景象。因此,您可以在此处指定readwrite,以使您的类能够在内部更改属性,但不能在外部世界中更改。
您还可以使用这些声明为您的方法声明.h中的公共接口和.m中接口Dude()中的私有方法。
公共和私有接口的组合必须有意义,你不能声明一个公共属性readwrite并在内部说它只是readonly ...
最后这是Objective-C:这只适用于您的编辑器和编译器。存在的所有东西都可以访问,即使它被声明为某种私有。