在Objective-C中完成保护属性的解决方法

我一直在试图find一个解决方法来声明在Objective-C中的@保护属性,所以只有层次结构中的子类可以访问它们(只读,而不是写)。 我读了这样做没有logging的方式,所以我想到了这个解决方法,我想问StackOverflow的意见。

层次结构顶部的每个自定义类都包含三个类,一个实现和两个接口。 我们来命名他们:

ClassA.h ClassA_protected.h ClassA.m 

然后,这个ClassA的任何子类将像往常一样:

 ClassB.h ClassB.m 

首先,我创build了一个接口ClassA.h ,我声明了一个受保护的intvariables,以便ClassA的任何子类都可以访问它:

 @interface ClassA : NSObject{ @protected int _myProtectedInt; } @end 

下一步是我正在谈论的解决方法。 但是,一旦你读了它,你会看到它是非常简单的。 我声明了第二个名为ClassA_protected.h的接口,它实际上是ClassA.h的扩展 ,并允许我们将属性标记为readonly

 #import "ClassA.h" @interface ClassA () @property (nonatomic , readonly) int myProtectedInt; @end 

准备受保护的层次结构的最后一步是在ClassA.m中声明它的实现,我们只综合我们的属性:

 #import "ClassA_protected.h" @implementation ClassA @synthesize myProtectedInt = _ myProtectedInt; @end 

这样,每个需要成为ClassA.h的子类的类都将导入ClassA_protected.h 。 所以像ClassB.h这样的孩子将如下所示:

 #import "ClassA_protected.h" @interface ClassB : ClassA @end 

还有一个从ClassB.m的实现中访问这个属性的例子:

 @implementation ClassB -(void) method { //edit protected variable _myProtectedInt= 1; //normal access self.muProtectedInt; } @end 

当然,这工作正常。 例如,Apple在UIGestureRecognizer类中使用相同的方法。 子类必须导入附加的UIGestureRecognizerSubclass.h文件并覆盖在该文件中声明的方法。

对于简单的“属性”,只需使用伊娃。 这与所有实际用途的属性一样好。

此外,默认已经被保护。

如果你问意见,这是我的:如果你决定改变你的意见

_myProtectedInt

无论如何,他可能会成功,因为Objective-C运行时绝对有可能。 除此之外,您的解决scheme是相当好的。

Interesting Posts