说,我有C,D类,它们是通过以下方式定义的:
@interface C:NSObject
@end
@interface D:C
@end
我的目标是将原子属性P添加到C类中,以便仅在 类中在D类(及其派生类)中可见和可用。 / p>
什么是最好的方法?
PS 该属性必须在D中是原子的。
答案 0 :(得分:3)
Objective-C没有直接支持受保护的属性或方法。但是,有一种惯例可以做到这一点。像抽象方法一样-如果有人愿意,他可以轻松地违反它。
您在.m
文件中定义要保护的属性。
@interface DemoObject ()
@property NSString *protectedString;
@end
@implementation DemoObject
//implementation of the class
@end
该属性为 atomic -这是默认设置。
然后您从DemoObject
继承:
.h
文件
@interface InheritingObject : DemoObject
@end
.m文件
@interface DemoObject ()
@property NSString *protectedString;
@end
@implementation InheritingObject
- (instancetype)init {
if (self == [super init]) {
self.protectedString = @"Some String";
}
return self;
}
@end
这里发生的基本上是我们创建了DemoObject
的扩展,从而向InheritingObject
公开了我们需要的属性。使用DemoObject
的任何对象都不会看到protectedString
属性,因为它没有在其.h
文件中定义。可以看到属性的类是定义DemoObject
扩展名的类。
实际上,您可以通过这种方式向 any 类公开一个属性,而不仅仅是派生一个。因此很容易打破这一约定。但是,它会产生某种顺序,并产生一种受保护范围的错觉。
答案 1 :(得分:0)
您可以不用重复操作,因此更容易处理:
C.h:
@interface C : NSObject
…
@end
创建另一个头文件:
受保护的语言:
@interface C()
@property id protecedVisibility;
@end
厘米
@import "C.h"
@import "C_Protected.h" // You have to do this for correct implementation
D.m:
#import "C.h"
#import "C_Protected.h"
然后,您可以轻松地编辑受保护的部分。