objective-c – @synthesized实例变量的可见性是什么?

objective-c – @synthesized实例变量的可见性是什么?,第1张

概述如果您的公共界面中有一个属性,如下所示 @interface MyClass : NSObject@property(strong) NSString *myProp;@end 然后合成,实际上合成变量: @implementation MyClass@synthesize myProp = _myProp; // or just leave it at the default name.. 如果您的公共界面中有一个属性,如下所示

@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文件以外的任何内容)。它不是@保护,它不是@private,它只是未知。使用@private ivar,尝试访问它的其他代码将被告知它是私有的,但是使用合成的ivar,尝试访问它的其他代码将被告知该字段根本不存在。

作为一个思想实验,尝试想象一下ivar的行为像被保护的情况。你做一个子类,你在那里用这个ivar。现在你回到超类,并将@synthesize myProp更改为@synthesize myProp = foo。在子类中会发生什么?当编译器处理子类时,它看不到@synthesize行,所以它不知道你刚刚更改了ivar的名称。实际上,它甚至无法判断属性是否由ivar支持,或者是使用定制的访问器方法实现的。我希望很明显为什么这意味着子类不可能访问ivar,也不能有任何其他类。

也就是说,如果您在尝试访问ivar的同一个.m文件中编写代码,我不太确定编译器的作用。我期望它将ivar视为@private(因为编译器实际上可以看到ivar存在)。

此外,这些都不会对运行时方法产生任何影响。其他类仍然可以使用obj-c运行时方法来动态地查找你的类的ivar列表,​​并用它来处理。

总结

以上是内存溢出为你收集整理的objective-c – @synthesized实例变量的可见性是什么?全部内容,希望文章能够帮你解决objective-c – @synthesized实例变量的可见性是什么?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1036601.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存