2012-03-12 55 views
0

我寫了一個非常基本類與新的ARC和訪問器方法玩,只是爲了感受他們如何工作。從我讀過的,ARC應該取代手動引用計數,對吧?但是,我的訪問器方法出現問題。Obj-C訪問器和ARC

下面是我的Container我的類接口/實現:

// interface 
@interface Container : NSObject { 
    NSMutableString *string; 
} 

- (NSMutableString *)string; 
- (void)setString:(NSMutableString *)aString; 

@end 

// implementation 
@implementation Container 

- (NSMutableString *)string 
{ 
    return string; 
} 

- (void)setString:(NSMutableString *)aString 
{ 
    string = aString; 
} 

- (NSString *)description 
{ 
    return [NSString stringWithFormat:@"inner string = %@", string]; 
} 

@end 

它似乎好對我來說,所有的引用計數的細節是由ARC,我相信處理。發生在主方法的問題:

Container *myContainer = [[Container alloc] init]; 
    NSMutableString *aString = [NSMutableString stringWithString:@"Hello!"]; 

[myContainer setString:aString]; 

NSLog(@"%@", myContainer); 

[aString setString:@"Bye!"]; 

NSLog(@"%@", myContainer); 

aString = [myContainer string]; 
[aString setString:@"Bye, again!"]; 

NSLog(@"%@", myContainer); 

似乎aString指向string成員變量,當我改變aString這意味着我也改變string它。我試圖從main()方法釋放aString,但後來我得到一個編譯器錯誤。我該如何解決?我是否使用copy方法,或者有其他方法嗎?

+7

ARC環境下的變量將用'strong'參考創建。如果您需要複製存儲在指針中的值(因爲它似乎是上述情況),則您已將顯式聲明屬性爲複製或創建一個setter方法來複制存儲在變量中的值(這一直是這種情況ARC不會/不應該影響它)。 – Rog 2012-03-12 05:10:02

+0

所以我應該寫這個:'string = [aString copy]'?這會解決問題嗎? – rcplusplus 2012-03-12 05:12:38

+0

你不要在ARC下調用'release/retain/dealloc',讓編譯器爲你做。 – neevek 2012-03-12 05:20:43

回答

0

rcplusplus,

你問:

似乎ASTRING指向字符串成員變量,這意味着當我改變ASTRING我也改變串吧。我嘗試從main()方法釋放aString,但後來發生編譯器錯誤。我該如何解決?我是否使用複製方法,或者有其他方法嗎?

釋放任何ARC項目的方法是將其設置爲nil。這告訴編譯器你已經完成了這個項目。它在作業中發佈。

例子:

[myContainer setString: nil]; 
myContainer.string = nil; 

,或者從你的類中:

string = nil; 

安德魯