Xcode 4.5中@property和ivar的区别

时间:2012-10-18 13:16:53

标签: iphone ios properties ivars

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

在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?为什么你不能完全摆脱ivars而只是使用@properties?如果他们需要私有,那么只需在 .m 的界面扩展中使用它们。

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

我希望这个问题很清楚。

由于

2 个答案:

答案 0 :(得分:2)

通常,您始终可以使用属性。如果您有“assign”属性,则可以使用ivar,因为您的getter / setter中不需要任何内存管理。但是如果你应该保留对象,那么使用ivars是不方便的,因为当属性为你做这件事时你必须手动保留/释放它们。

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

你不能使用带有ivars的KVO

答案 1 :(得分:-1)

我认为这取决于您可以使用“->”语法访问公共ivars。 也许之前,如果你声明一个没有@private ivar的只读属性,你可以访问 使用“->”语法进行ivar。 (也许它打破封装)。

但现在如果你声明这样的话

{
@private NSArray *a;
@protected NSArray *b;
@public NSArray *c;
}
@property (nonatomic, retain) NSArray *d; 

您只能使用“->”访问“c”ivar,只需尝试此代码即可。 a,b和d将是警告或错误。

如果它有所帮助,我会很高兴。