@synthesized实例变量的可见性是多少?

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列表并使用它进行清理.

  • 很好解释! (6认同)