众所周知,在 .h 文件中声明的 ObjC 属性是接口“外部可见”,而在 .m 文件中声明的属性(类扩展名)只能在 .m 中访问,即“私有”或“隐藏”。但实际上可以编译如下代码。
类A.h
@interface ClassA : NSObject
+ (void)foo;
@end
类A.m
#import "ClassA.h"
@interface ClassA ()
@property (nonatomic) NSInteger aInt;
@end
@implementation ClassA
+ (void)foo {
ClassA *aObj = [ClassA new];
aObj.aInt = 2; //?
}
@end
@interface _ClassB : NSObject //Some private class defined in the same .m file...
@end
@implementation _ClassB
+ (void)bar {
ClassA* aObj = [ClassA new];
aObj.aInt = 2; //?
}
@end
事实是,不仅ClassA *aObj
定义在ClassA
自己的方法可以访问类扩展属性aInt
,而且ClassA *aObj
定义在另一个_ClassB
同时在同一个ClassA.m文件中也可以访问aInt
。
据我了解,aObj
在类方法中定义与在另一个类和单独的 .m 文件中定义的foo
任何类型变量没有区别。ClassA *
但是后者绝不会访问'aInt',比如说
C类.m
#import "ClassA.h"
...
- (void)fun {
ClassA *aObj = [ClassA new];
NSLog("%d", aObj.aInt); //Error! Property aInt not found on object of type 'ClassA*'
}
为什么会这样?这可以用 ObjC 运行时机制或其他什么来解释吗?