jbr*_*nan 16 cocoa encapsulation properties objective-c
如果您的公共界面中有属性,如下所示
@interface MyClass : NSObject
@property(strong) NSString *myProp;
@end
Run Code Online (Sandbox Code Playgroud)
然后合成它,实际上合成变量:
@implementation MyClass
@synthesize myProp = _myProp; // or just leave it at the default name..
@end
Run Code Online (Sandbox Code Playgroud)
实例变量的可见性是_myProp多少?也就是说,这是考虑过@public,@protected还是@private?我猜是因为MySubClass可以从那时继承MyClass它也会得到属性(自然),但是它还会继承实例变量可见性吗?
如果我将属性放在类扩展中会有什么不同?这会将属性隐藏在子类中,我也猜测实例变量.这记录在哪里?
Lil*_*ard 29
合成的ivar 对于无法看到该行的所有代码完全不可见@synthesize(这基本上意味着.m文件之外的任何内容).它不是@protected,它不是@private,它只是未知.使用@privateivar,其他试图访问它的代码将被告知它是私有的,但是使用合成的ivar,其他试图访问它的代码将被告知该字段根本不存在.
作为一个思想实验,试着想象一下伊娃的行为就像它一样@protected.你做了一个子类,然后在那里使用了ivar.现在你回到超类并@synthesize myProp改为@synthesize myProp=foo.子类中会发生什么?当编译器处理子类时,它无法看到该@synthesize行,因此它不知道您刚刚更改了ivar的名称.事实上,它甚至无法判断该属性是否完全由ivar支持,或者是否使用自定义编写的访问器方法实现.我希望很明显为什么这意味着子类不能访问ivar,也不能访问任何其他类.
也就是说,如果你在试图访问ivar的同一个.m文件中编写代码,我不太清楚编译器会做什么.我希望它会将ivar视为@private(因为编译器实际上可以看到ivar存在).
此外,这些都与运行时方法无关.其他类仍然可以使用obj-c运行时方法来动态查找类的ivar列表并使用它进行清理.
| 归档时间: |
|
| 查看次数: |
4126 次 |
| 最近记录: |