Objective c IVAR与类扩展

Objective c IVAR与类扩展,objective-c,properties,instance-variables,class-extensions,Objective C,Properties,Instance Variables,Class Extensions,假设以下所有代码都写在一个实现文件中。有人能解释一下它们之间的区别吗: #1 @interface ViewController () @property (nonatomic) NSDictionary *currentAlbumData; @end @implementation ViewController #2 @interface ViewController () { NSDictionary *currentAlbumData;

假设以下所有代码都写在一个实现文件中。有人能解释一下它们之间的区别吗:

#1

    @interface ViewController ()
    @property (nonatomic) NSDictionary *currentAlbumData;
    @end

    @implementation ViewController

#2
    @interface ViewController () {
    NSDictionary *currentAlbumData;
    }
    @end

    @implementation ViewController

#3
    @interface ViewController
    @end

    @implementation ViewController {
    NSDictionary *currentAlbumData;
    }

    - some methods here - 
    @end

在我看来,第一个在类扩展中声明了一个属性变量。第二个在类扩展中声明实例变量。第三个声明的实例变量不是类扩展…这意味着什么?它与在类扩展中简单地声明ivar相比如何?

属性和实例变量之间的差异应该是显而易见的


在扩展中定义ivar与在实现中定义ivar的区别在于可见性。虽然您在文章中包含的私有扩展通常与实现写在同一个文件中,但它们不必是。接口可以在任何地方定义,编译器/链接器可以看到的所有扩展在构建时都被合并到一个类定义中。

我自己是否可以看到?就像在中一样,我可以在同一个文件中看到扩展变量,而不是导航到其他地方的不同文件?不太清楚。此外,这是否不是范围问题(如文件范围与全局范围)?在
@interface
节中定义的实例变量对任何看到它的代码都是可见的。无论
@接口是扩展还是主接口,这都无关紧要。