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

标签 objective-c cocoa properties encapsulation

如果您的公共(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/

相关文章:

objective-c - 来自任何应用程序的数据使用

objective-c - UITableView 不重新加载内容

objective-c - Cocos2D CCScene 黑屏,没有任何反应?

objective-c - Objective C 嵌套字典访问无效选择器错误

objective-c - NSMenuItem 焦点/翻转通知

java - 从嵌入式 jar 中获取应用程序属性 - Spring Boot

ios - 当我滑动删除时表格单元格崩溃。获取错误的访问错误

objective-c - 如何以编程方式将较大的 NSImage 放置在较小的 NSImageView 中?

java - 使用配置文件设置 Java 系统属性

java - 在 Spring 中使用 Mockito 模拟属性文件