繁体   English   中英

Xcode 4.5中@property和ivar的区别

[英]Difference between @property and ivar in Xcode 4.5

以前我一直看到使用属性和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没有它相关的伊娃。

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

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 为什么你不只是摆脱实例变量的完整,只是使用@properties 如果它们需要是私有的,那么只需在.m中的接口扩展中使用它们。

快速编辑以响应有关内存管理的答案。 我使用ARC,对我来说似乎是我有过的内存管理,使用更多的控制strongweak @properties比我用的ivars。

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

谢谢

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

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

而你不能使用伊娃的KVO

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

但现在如果你宣布这样的话

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM