之前我一直看到使用属性和实例变量的例子是这样的...
在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
,而是建议仅使用@property
而不使用其相关联的iVar。
因此,上述内容将变为...
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
?为什么不完全放弃ivar,只使用@properties
呢?如果它们需要是私有的,则只需在.m中的接口扩展中使用它们。
快速编辑以回答关于内存管理的答案。我正在使用ARC,对我来说,使用strong
和weak
@properties
比使用ivars更能控制内存管理。
希望问题表述清楚。
谢谢
someString
的属性,具有默认的后备iVar命名为_someString
,以及第二个iVar与该属性没有任何关联,但仅为了引起痛苦而被命名为someString
。 :-) - Phillip Mills@property
使您能够在普通 iVar 无法使用 KVO 的情况下使用它。除了您已经提到的之外,我不知道还有什么其他优缺点。 - Tim Reddy