簡體   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