2013-03-13 51 views
6

在ARC項目中工作時,使用實例變量(在接口上聲明),它們的@property@synthesize的正確方法是什麼?我現在做的是以下幾點:在ARC中使用實例變量/屬性/合成的正確方法

SomeClass.h:

@interface SomeClass : NSObject { 
    NSString *someString; 
} 
@property(nonatomic, copy) NSString* someString; 

和SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

- (void)someMethod { 
    self.someString = @"Foobar"; 
} 

的事情是,有一些作品,如僅使用其他方法@屬性:

SomeClass.h:

@interface SomeClass : NSObject 
@property(nonatomic, copy) NSString* someString; 

訪問someStringself

SomeClass.m:

@implementation SomeClass 

@synthesize someString; 

- (void)someMethod { 
    someString = @"Foobar"; 
} 

等我是新來的Objective-C,我已經習慣了的Java。那麼使用屬性的正確方法是什麼?我知道特殊情況會有特殊的行爲,但一般情況下最好的辦法是什麼? (一般我的意思是我想從類本身和「外部」訪問變量,我希望ARC仍然正常工作,例如,我不必擔心內存泄漏)

+2

只需定義屬性。如果你使用Xcode 4.5+,你甚至不需要合成語句。這被認爲是正確的方式,因爲屬性會自動創建iVar。如果您需要使用iVar,那麼如果在Xcode 4.5+中,在屬性名稱前面使用「_」(因爲它們是自動創建的),如果不是,則創建它們,如下所示:@synthesize variable = _variable; – Petar 2013-03-13 11:59:02

+0

@ pe60t0實際上在Xcode 4.4中引入了不再需要使用'@ synthesize'語句的需求。 – 2013-03-13 12:08:32

+0

我的不好,現在無法編輯評論。 – Petar 2013-03-13 12:13:08

回答

9

對於簡單的屬性,您不需要實例變量聲明或@synthesize。 clang編譯器默認會爲你生成。所以,你可以在標題寫:

@interface SomeClass : NSObject 

@property (nonatomic, copy) NSString *someString; 

@end 

和實現:

@implementation SomeClass 

- (void)someMethod { 
    self.someString = @"Foobar"; 
} 

@end 

避免直接實例變量的訪問,除非你是在-init方法或重寫的制定者。其他地方你應該使用點語法(self.someString)。如果確實需要訪問實例變量,默認合成將創建一個帶下劃線的前綴ivar,例如, _someString

注意,對於可變版本一樣NSString/NSMutableStringNSArray/NSMutableArray類標準的做法是使用copy屬性。如果你在字符串或數組上使用strong,調用者可能會傳入一個可變的版本,然後在你的下面進行變異,導致很難找到的錯誤。

-2

檢查出this SO post關於ARC的信息。

編輯)「strong」屬性告訴ARC保留一個對象,直到具有該屬性的對象被釋放。您確實需要「copy」屬性,因爲NSString屬性可能已經作爲NSMutableString傳入。 「複製」保證原始對象將被保留。再次,我爲我原本在這裏發現的錯誤/誤導性信息表示歉意。

的原因,你可以訪問實例變量someString還有財產self.someString是,@synthesize someString線的屬性創建一個實例變量,並創建用於獲取和設置它的價值的方法。但是,建議您使用屬性而不是直接使用實例變量,因爲通過使用實例變量,您不能讓父對象知道您已更改其某個屬性。

+0

請注意,由於Xcode 4.4如果沒有明確使用'@ synthesize',那麼實例變量將隱式命名爲'_someString'並帶有下劃線。 – 2013-03-13 12:12:05

+1

在字符串中使用'strong'是錯誤的。在'NSString'或'NSArray'等東西中,調用者可以通過可變子類('NSMutableString'或'NSMutableArray'),然後在稍後對它進行變異,這是標準做法。 – 2013-03-13 12:18:46

相關問題