2011-11-25 61 views
1

所以我抓住從外地用戶名,將其保存在一個NSString變量:保存[NSTextField stringValue] ...變量在我的窗口關閉時被清除?

loggedInUser = [usernameField stringValue]; 
    [loginWindow close]; 

後來,我嘗試訪問loggedInUser數據:

NSLog(@"Logged in User:%@", loggedInUser); 

這通常,但並非總是如此,給人一個錯誤:

Program received signal: "EXC_BAD_ACCESS". // Summary displays "{...}" for the value 

loggedInUser NSString被清除了嗎?發生了什麼? (我從來不會修改這個值)。

我唯一的想法是,我以某種方式保存NSString中NSTextField的值繼續。然後,當我關閉窗口時,該值被清除。

這是怎麼回事?如何以安全的方式保存Textfield值以便繼續使用?

+0

如果你在談論NSTextFields,爲什麼你有這個標籤可可觸摸和ios標籤? –

+0

當您創建並顯示窗口時,['[yourWindow isReleasedWhenClosed]'](http://developer.apple.com/library/mac/documentation/Cocoa/Reference/ApplicationKit/Classes/NSWindow_Class/Reference/Reference。 html#// apple_ref/occ/instm/NSWindow/isReleasedWhenClosed)return?我懷疑你的窗口(以及它的內容)在關閉後立即被釋放。 –

+0

@MichaelDautermann,爲什麼'isReleasedWhenClosed'屬性很重要?我猜這就是這個問題的關鍵。我將用戶名文本數據保存到全局(這是正確的術語?)NSString。所以在我將它保存在那裏之後,爲什麼我對原始字符做什麼? – cksubs

回答

3

啊,我剛剛意識到發生了什麼事情。

當你關閉你的窗口(它很可能被釋放)時,你分配給你的對象的NSString變量的字符串也會被自動釋放。

您需要明確地保留它。

或者,更重要的是,這樣做:

loggedInUser = [[NSString alloc] initWithString: [usernameField stringValue]]; 

或:

loggedInUser = [[usernameField stringValue] copy]; 

不要忘記釋放loggedInUser當你dealloc方法被調用(假設你不使用ARC在這裏)。

1

另一種解決方案是將字符串存儲在屬性而不是實例變量中。您可以聲明該屬性爲strong(或retain)或copy,然後您將擁有該字符串(或其副本)。

你提到,當字符串死亡時,變量「被清除」,但事實並非如此。變量不是已清除,這是崩潰的原因:它仍保存着指向現在已死的對象的指針。使用strongcopy保持活動是一種解決方案,但是另一種選擇(如果您遷移到ARC)將聲明該屬性爲weak。然後,在Mac OS X 10.7和更高版本中,只要字符串死掉,該屬性將被清除(設置爲nil)。