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
节中定义的实例变量对任何看到它的代码都是可见的。无论@接口是扩展还是主接口,这都无关紧要。