[英]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.