2012-06-04 61 views
0

我知道標題聽起來可能有點不可思議,但同樣適用於這個問題。可變突然撤掉

我一直在測試我的應用程序在模擬器上幾乎是在發展的整個時間,我沒有在真實的設備上,而一次測試,以確保公正。 但現在我已經接近完成一個問題了。

每當我大跳登錄,我的整個應用程序崩潰說的用戶名和密碼變量被釋放......

這裏是我的應用程序的流程:

當打開的應用程序,它會檢查用戶名和密碼被保存或注意

- (void)checkIfPreviouslyLoggedIn:(BOOL)didLogin andLogin:(BOOL)doLogin { 
    // some logic to get it out of the keychain 
    NSLog(@"checkIfPreviouslyLggedIn: ACCOUNT %@/%@", tmpUsername, tmpPassword); 

    // RETURN: checkIfPreviouslyLggedIn: ACCOUNT/
} 

沒有之前保存的,沒什麼大不了的,用戶將只需輸入帳號和新聞中心登錄

- (void)loginWithUsername:(NSString *)username andPassword:(NSString *)password { 
     NSLog(@"loginWithUsername: ACCOUNT %@/%@", username, password); 
     // RETURN: loginWithUsername: ACCOUNT testUser/password 

     // save it for later use 
     _username = username; 
     _password = password; 

     NSLog(@"loginWithUsername: ACCOUNT %@/%@", _username, _password); 
     // RETURN: loginWithUsername: ACCOUNT testUser/password 

     // Attach a notification handler 
     [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginCheck:) name:@"LoginCheck" object:nil]; 

     // call the web API 
     [self doRequestFromLocation:@"/groups" withPostType:@"GET" andData:nil whichTriggersNotification:@"LoginCheck"]; 
} 

酷,用戶名和密碼是很好的記錄,到目前爲止好,在doRequestFromLocation基本上是一個隊列類型的事情,我可以爲我想發送儘可能多的請求,它會處理逐一

- (void)doRequestFromLocation:(NSString *)location withPostType:(NSString *)type andData:(NSData *)data whichTriggersNotification:(NSString *)notification { 
     NSLog(@"doRequestFromLocation: ACCOUNT %@/%@", _username, _password); 
     // RETURN: doRequestFromLocation: ACCOUNT testUser/password 
} 

然後去一個doRequest方法,來完成實際的數據請求,再說,我有我的登錄用戶名和它的返回正確的。

NSLog(@"doRequest: ACCOUNT %@/%@", _username, _password); 

這是在這之後,一切都發生可怕的事情,完成請求時,loginCheck()被調用

- (void)loginCheck:(NSNotification *)notification { 
    NSLog(@"loginCheck: ACCOUNT %@/%@", _username, _password); 
} 

在這裏我_username和_password將被釋放,即使實際調用之前我的權利檢查用戶名和密碼,他們仍然沒問題。

所以不知何故(神奇)的2個變量得到了釋放,沒有任何理由。 注意_username和_password在loginWithUsername唯一一套,他們沒有在任何地方我的應用程序更改。

2012-06-04 13:33:28.001雞舍[5060:707] * - [CFString字符串respondsToSelector:]:消息發送到釋放的實例0x1099fc40 2012-06-04 13:33:28.648雞舍[ 5060:707] * - [CFString字符串_cfTypeID]:消息發送到釋放實例0x1099fc40

什麼原因可能造成這一點,我添加了多個斷點,才意識到呼叫和loginCheck(),他們消失之間的某處。

回答

1

的問題是在這裏:

// save it for later use 
     _username = username; 
     _password = password; 

的變量_username_password不會保留,這就是爲什麼他們得到自動釋放。

無論是在NON-ARC的情況下,聲明爲@property(retain)和ARC,@property(strong)使用:

self._username = username; 
self._password = password; 

現在你自己的內存的所有權,現在你必須釋放它時,你就大功告成了。

+0

這確實是問題的任何更多的幫助,這事模擬器以不同方式處理?那裏我從來沒有遇到任何問題。 –

1

請檢查你是如何在你的頭文件中聲明你的屬性(_username和_password)的。如果它沒有聲明爲

@property (nonatomic, retain) NSString * _username; 
@property (nonatomic, retain) NSString * _password; 

那麼你的屬性會得到autoreleased。因此,稍後當您嘗試訪問此屬性時,您會收到他們釋放的消息。

此外,當您將變量聲明爲頭文件中的屬性時,請使用「self」進行訪問。

請您在取消分配屬性後才能取消分配屬性,不需要再訪問此屬性。

請讓我知道是否有需要在同一