【发布时间】:2012-10-08 23:17:28
【问题描述】:
以前我总是看到像这样使用属性和 iVar 的例子......
在 SomeClass.h 中
@interface SomeClass : NSObject {
NSString *_someString;
}
@property NSString *someString;
@end
然后在 SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
@synthesize someString = _someString;
@end
最近(在 WWDC 2012 视频中)我听说我们不再需要 @synthesize,建议只使用不关联 iVar 的 @property。
所以上面会变成...
SomeClass.h
@interface SomeClass : NSObject
@property NSString *someString;
@end
SomeClass.m
#import "SomeClass.h"
@implementation SomeClass
@end
这只是使用@property 而没有 ivar。这是有道理的,我一直在使用它。
不过,我也看到过……的例子
SomeClass.h
@interface SomeClass : NSObject
@end
SomeClass.m
#import "SomeClass.h"
@interface SomeClass () {
NSString *someString;
}
@end
@implementation SomeClass
@end
在此他们只有一个私人iVar 而没有@property。
那么有什么区别呢?我知道@property 也提供了访问器方法,但您不必重写访问器方法。您可以只使用默认访问器。
那么什么时候你会使用@property 而不是ivar,什么时候你会只使用ivar 而不是@property?为什么不完全摆脱 ivars 而只使用@properties?如果它们需要私有,那么只需在 .m 的接口扩展中使用它们。
快速编辑以响应有关内存管理的答案。我正在使用 ARC,对我来说,使用 strong 和 weak @properties 似乎比使用 iVars 可以更好地控制内存管理。
我希望问题足够清楚。
谢谢
【问题讨论】:
-
请注意,上面的第一个示例很糟糕。在其中,您有一个
someString属性和一个名为_someString的默认支持 iVar 和第二个与该属性没有连接但命名为someString的 iVar,只是为了引起痛苦。 :-) -
@Phillip Mills,现在更正了。
-
@property使您能够在常规 iVar 无法使用的情况下使用 KVO。除了你已经提到的,我不知道任何其他优点/缺点。 -
基本上,两者都可以访问相同级别的内存管理。 iVar 没有 getter 和 setter,而属性有。属性允许使用 KVO 而 iVar 不允许。然后我会坚持使用属性:D
标签: iphone ios properties ivars