以前我一直看到使用属性和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,对我来说,使用strong
和weak
@properties
时,我可以更好地控制内存管理,而不是使用iVars。
我希望这个问题很清楚。
由于
答案 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将是警告或错误。
如果它有所帮助,我会很高兴。