在实现界面时,似乎教程和文献中的常用方法是声明一个ivar,然后设置@property
然后设置@synthesize
。
@interface MyClass : NSObject {
NSString *myString;
}
@property (nonatomic, retain) NSString *myString;
@end
但是,省略显式声明并仅放置@property具有相同的效果。
@interface MyClass: NSObject {
}
@property (nonatomic, retain) NSString *myString;
@end
那么大多数人如何使用@property
和明确的声明呢?不好的形式不是吗?
答案 0 :(得分:15)
过去是必要的。 Objective-C运行时有两种不同的版本:一个32位的“遗留”运行时(旧的)和一个32/64位的运行时(新的32位运行时仅用于iOS设备和iOS模拟器)。
我认为这仍然是唯一需要的地方是你在32位模式下运行应用程序(10.5或10.6)。其他地方(64位Leopard,64位Snow Leopard,Lion,iOS)使用具有“自动ivar合成”的新运行时,产生的ivars称为“合成ivars”。
答案 1 :(得分:2)
某些平台支持合成的实例变量,有些则不支持。明确声明实例变量会使您的代码在更多地方有效,并且直到最近才过去是完全必要的,因此人们仍然会这样做。几年后,他们可能不会再这样了。
答案 2 :(得分:1)
使用Xcode的现代版本(任何关于4.2或更高版本的东西),没有理由在标题中声明iVar。任何可公开访问的内容都应声明为属性。
许多人忘记了Objective C对象实际上是指向C结构的指针。因此,通过使用myObject->myPublicIVar
传递getter和setter,可以直接访问标头中声明的任何iVar。特别是在非ARC代码中,这是非常危险的。 @private
指令阻止使用->
运算符访问iVars,但仍然会使头文件混乱。当有更好的方法时,@private
没有意义。
应该在.m文件中声明任何私有内容。通常,这需要类扩展,如下所示:
// The .h file
@interface Foo : NSObject
@property (nonatomic, strong) NSString *myPublicString;
@end
// The .m file
@interface Foo ()
@property (nonatomic, strong) NSString *myPrivateString;
@end
@implementation Foo {
NSString *myPrivateIVar;
}
// Xcode 4.5 or later will not require these @synthesize
@synthesize myPublicString = _myPublicString;
@synthesize myPrivateString = _myPrivateString;
@end
这样的实现提供了由iVar支持的公共属性,由iVar支持的私有属性以及私有的独立iVar。我已经包含了@synthesize指令,但使用现代工具并不是必需的。
答案 3 :(得分:-3)
@property只实现访问器方法,实例变量本身必须存在。尝试忽略ivars,如果不是在编译时,它将在运行时失败。