如果您的公共(public)接口(interface)中有如下属性
@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
可以从 MyClass
继承,那么它也会(自然地)获得属性,但它是否也会继承实例变量可见性?
如果我将属性放在类扩展中会有什么不同?那会隐藏子类的属性,我猜实例变量也是。这在任何地方都有记录吗?
最佳答案
合成的 ivar 对所有看不到 @synthesize
行的代码都是完全不可见(这基本上意味着 .m 文件之外的任何内容)。它不是@protected
,也不是@private
,它只是未知的。对于 @private
ivar,其他试图访问它的代码将被告知它是私有(private)的,但是对于合成的 ivar,其他试图访问它的代码将被告知该字段根本不存在。
作为一个思想实验,试着想象一种情况,在这种情况下,ivar 的行为就像是 @protected
。您创建了一个子类,然后在那里处理了 ivar。现在您回到父类(super class)并将 @synthesize myProp
更改为 @synthesize myProp=foo
。子类中发生了什么?当编译器处理子类时,它看不到 @synthesize
行,因此它不知道您刚刚更改了 ivar 的名称。事实上,它甚至无法判断该属性是否完全由 ivar 支持,或者它是否使用自定义编写的访问器方法实现。我希望很明显为什么这意味着子类不可能访问 ivar,任何其他类也不能。
也就是说,如果您在尝试访问 ivar 的同一个 .m 文件中编写代码,我不太确定编译器会做什么。我希望它会将 ivar 视为 @private
(因为编译器实际上可以看到 ivar 存在)。
此外,这些都与运行时方法无关。其他类仍然可以使用 obj-c 运行时方法动态查找您的类的 ivar 列表并处理它。
关于objective-c - @synthesized 实例变量的可见性是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8510464/