2012-04-11 91 views
0

我不能belice我問這個,但即時通訊非常瘋狂與這個可變的東西。變量在我的iOS應用程序?

我想保存用戶名信息。我加載他們在我看來的負載。在此之後,當我點擊一個按鈕時,我將獲得信息。

這裏是我的代碼:

@interface SelfViewController : UIViewController 
{ 
    NSString *usernameString; 
} 



- (void)viewDidLoad 
{ 
    usernameString = @"test"; 
} 



- (IBAction)goToProfileButtonPressed:(id)sender 
{ 
    NSLog(@"%@", usernameString); //CRASH BAD EXEC 

} 

我是怎麼錯了????

+0

你應該合成你的iVar並生成一個屬性。你會得到一個壞的執行錯誤,因爲你確實保留了自動釋放的NSString @「test」 – CarlJ 2012-04-11 14:23:36

+0

該代碼除了它不是一個完整的小例子之外沒有任何問題。你也應該說明你是否使用ARC。 – Joe 2012-04-11 14:23:57

+0

我的第一個猜測是該按鈕未正確連接到SelfViewController的實例。如果你刪除了'NSLog',你能按下按鈕而不會導致崩潰嗎? – Dondragmer 2012-04-11 14:25:12

回答

1

更改您的.h文件:

@interface SelfViewController : UIViewController { 
    NSString *usernameString; 
} 

@property (retain, nonatomic) NSString *usernameString; 

然後在你的.m文件中:

@synthesize usernameString; 

- (void)viewDidLoad { 
     self.usernameString = @"test"; 
} 

- (IBAction)goToProfileButtonPressed:(id)sender { 
    NSLog(@"%@", self.usernameString); // "self." can be omitted, but it is best practice not to 
} 

- (void)dealloc { 
    [usernameString release]; 

    [super dealloc]; 
} 

問題是您將usernameString分配給自動發佈的字符串對象。在按下該按鈕時,usernameString已被釋放,並已成爲垃圾內存。通過保留它(並且隨後在-dealloc中釋放它以避免泄漏),您知道它不會過早釋放。

+0

自我是問題。謝謝 – Kovu 2012-04-11 14:47:46

+0

沒問題 - 「self」意味着不是直接設置變量,而是根據屬性類型執行操作。正如我們已經設定它保留(和非原子,這意味着它是線程不安全但更快),通過使用'self'它保留。希望這是有道理的! – jrtc27 2012-04-11 14:51:27

+0

只是一個小的術語更正:「問題是您將usernameString分配給自動釋放的字符串對象」< - 實際上不是,從方法返回時,字符串常量* *不*自動釋放並且*不*釋放。但是,在範圍結束後,它們會從內存中清除。堆棧分配的本地數組發生的情況也是如此。 – 2012-04-11 15:03:31

0

您需要綜合ivar並將其作爲屬性添加。 (對於未-ARC編譯):

@interface SelfViewController : UIViewController 
{ 
    NSString *usernameString; 
}  
@property (nonatomic, retain) NSString *usernameString; 
在.M

在.H

@synthesize usernameString; 
+0

沒有這個,沒有任何變化 – Kovu 2012-04-11 14:29:13

相關問題