如果您的公共接口中有如下属性
@interface MyClass : NSObject
@property(strong) NSString *myProp;
@end
然后合成它,实际上就是合成变量:
@implementation MyClass
@synthesize myProp = _myProp; // or just leave it at the default name..
@end
实例变量的可见性是什么?也就是说,这被认为是
_myProp
、@public
还是@protected
?我猜既然@private
可以从MySubClass
继承,那么它也会(自然地)获得属性,但是它会继承实例变量可见性吗?如果将属性放在类扩展中有什么区别?这将隐藏子类的属性,我猜实例变量也是。这有记录吗?
最佳答案
对于所有看不到@synthesize
行的代码来说,合成的ivar是完全不可见的(这基本上意味着.m文件之外的任何东西)。它不是,它不是,它只是未知的。使用作为一个思维实验,试着想象一个ivar表现为@protected
的情景。你做了一个亚类,然后在那里和ivar混在一起。现在回到超类并将@private
更改为@private
。子类中发生了什么?当编译器处理子类时,它不能看到@protected
行,因此它不知道您刚刚更改了IVAR的名称。事实上,它甚至无法判断该属性是否由ivar支持,或者是否使用自定义编写的访问器方法实现。我希望很明显,这意味着子类不可能访问ivar,其他类也不能访问ivar。
也就是说,如果你在试图访问IVAR的.m文件中编写代码,我不太清楚编译器会做什么。我希望它会把IVAR当作@synthesize myProp
(因为编译器实际上可以看到IVAR存在)。
而且,这些都没有对运行时方法有任何影响。其他类仍然可以使用Obj-C运行时方法来动态地查找类的IVAR列表并利用它进行处理。
关于objective-c - @synthesized实例变量的可见性是什么?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8510464/