Xcode 4.5中@property和ivar的区别

Fog*_*ter 12 iphone properties ios ivars

以前我一直看到使用属性和iVars这样的例子......

在SomeClass.h里面

@interface SomeClass : NSObject {
    NSString *_someString;
}

@property NSString *someString;

@end
Run Code Online (Sandbox Code Playgroud)

然后在SomeClass.m中

#import "SomeClass.h"

@implementation SomeClass

@synthesize someString = _someString;

@end
Run Code Online (Sandbox Code Playgroud)

最近(在WWDC 2012视频中)我听说我们不再需要@synthesize它,建议只使用@property没有它的相关iVar.

所以上面会变成......

SomeClass.h

@interface SomeClass : NSObject

@property NSString *someString;

@end
Run Code Online (Sandbox Code Playgroud)

SomeClass.m

#import "SomeClass.h"

@implementation SomeClass

@end
Run Code Online (Sandbox Code Playgroud)

这只是使用@property和没有ivar.这是有道理的,我一直在使用它.

但是,我也看过......的例子

SomeClass.h

@interface SomeClass : NSObject

@end
Run Code Online (Sandbox Code Playgroud)

SomeClass.m

#import "SomeClass.h"

@interface SomeClass () {
    NSString *someString;
}

@end

@implementation SomeClass

@end
Run Code Online (Sandbox Code Playgroud)

在这个他们只有一个私人iVar和没有@property.

那有什么区别?我知道它也@property提供了访问器方法,但您不必重写访问器方法.您可以使用默认访问者.

所以你什么时候才能使用@property而不是ivar @property?什么时候才能使用ivar而不是?你为什么不完全摆脱伊娃,只是使用@properties?如果它们需要是私有的,那么只需在.m中的接口扩展中使用它们.

快速编辑以响应有关内存管理的答案.我正在使用ARC,对我来说,似乎我可以更好地控制使用内存管理,strongweak @properties不是使用iVars.

我希望这个问题足够清楚.

谢谢

igo*_*ris 2

一般来说,您始终可以使用属性。如果你有“分配”属性,你可以使用 ivar 因为你不需要在 getter/setter 中进行任何内存管理。但是,如果您应该保留对象,那么使用 ivars 就很不方便,因为您必须手动保留/释放它们,而属性会为您执行此操作。

另外,如果您使用 ivars,您将无法控制设置/获取值。一般来说,使用公共字段而不是 getter 或 setter 是一种不好的做法。例如,如果您可以为存储人员年龄的字段设置负值,那就不行了。

而且你不能将 KVO 与 ivars 一起使用

  • 1)如果您使用ivars,您将无法控制设置/获取值。一般来说,使用公共字段而不是 getter 或 setter 是一种不好的做法。例如,如果您可以为存储人员年龄的字段设置负值,那就不行了。2) 不能将 KVO 与 ivars 一起使用 (2认同)