[英]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,对我来说似乎是我有过的内存管理,使用更多的控制strong
和weak
@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.