2011-08-03 55 views
0

我不明白如何聲明一個可以在多個方法中訪問的指針。以下代碼使用myContainer來存儲調用useMyContainer時使用的數字。如何訪問多個實例方法中的指針?

@interface MyViewController : UIViewController { 
    NSString *myContainer; 
    IBOutlet UILabel *display; 
} 
- (IBAction)storeToMyContainer: (UIButton *)sender; 
- (IBAction)useMyContainer: (UIButton *)sender; 
@end 

@implementation MyViewController 
- (IBAction)storeToMyContainer: (UIButton *)sender { 
myContainer = sender.titleLabel.text; 
} 
- (IBAction)useMyContainer: (UIButton *)sender { 
[someOtherClass doSomethingWith:[myContainer doubleValue]]; 
} 
@end 

我不明白的是,當我以同樣的方式使用display,我沒有問題。我需要做什麼才能以這種方式訪問​​useMyContainer中的myContainer

一些想法:我知道這是一個內存管理問題,我幾乎可以肯定顯示屏上正在調用retain(可能是通過.xib文件?),這就是爲什麼display掛起足夠長時間才能使用在這兩種方法中。

我知道一個解決方法,涉及到使用雙精度和整數,但我認爲這是凌亂的,因爲我正在上這個課,所以我想知道用這種方法來處理這個問題。

感謝您的幫助!

回答

1

處理這個問題的正確方法是爲您的'myContainer'字段處理內存管理。

我會去的:

myContainer = [sender.titleLabel.text copy]; 

建議使用副本的NSString。相關討論的線索是here

此外,請不要忘記釋放'myContainer'字段的內存。你可以在你的dealloc方法中做到這一點:

-(void) dealloc { 
    [myContainer release]; 
    [super dealloc];  
} 
+0

是否可以'[myContainer release]';在useMyContainer中使用它之後:? – Caborca87

+1

在技術上是的,這將工作。您基本上會立即放棄「myContainer」字段中的值。但是,通過這樣做,您可以在代碼中隱含一個隱含的假設。這個假設是:'useMyContainer:'&&'useMyContainer:'應該在'連續調用'之前調用'storeToMyContainer:'。如果'useMyContainer:'在一行中被調用兩次(不調用'storeToMyContainer:'),則第二次調用將失敗,因爲釋放了'myContainer'字段。 – Guven

0

你說這是內存管理問題是正確的。基本上,您並不是要求存儲在myContainer中的字符串的「擁有權」。調用storeToMyContainer:之後的一段(短的)時間段後,包含發送者字符串的自動釋放池將被耗盡,並且因爲您沒有說您仍在使用它,所以它不再存在。

要聲明字符串的所有權,您必須retain(或copy)它。因此,更新您的代碼:

- (IBAction)storeToMyContainer:(UIButton *)sender { 
    myContainer = [sender.titleLabel.text retain]; 
} 

另一種方法是使用properties。無論哪種方式,我建議您閱讀Memory Management Programming Guide,特別是Basic Memory Management Rules

+0

感謝您的提示! – Caborca87

相關問題