2011-08-14 52 views
1

在IPhone應用程序,我做了一個常量文件來保存我的全局變量:IPhone - Obective C - 如何在多個線程共享外部變量?

MyConstants.h 
extern NSMutableString * MY_GATEWAY; 


MyConstants.m 
NSMutableString * MY_GATEWAY; 

在我的應用程序委託我有進口MyConstants.h,並能成功地追加到MY_GATEWAY並通過URL初始化我的全局變量這個:

MY_GATEWAY = [NSMutableString stringWithString:MY_PROTOCOL]; 
[MY_GATEWAY appendString:MY_HOST]; 

從我的應用程序委託,初始化MY_GATEWAY後,我啓動一個新的線程。我的線程類也進口MyConstants.h並在該線程我嘗試讀取MY_GATEWAY的主循環,但值是垃圾:

2011-08-13 22:23:47.246 MyProject[930:5c03] da.lproj 

我應該可以從輔助線程讀取這個變量?如果是這樣,我做錯了什麼?

感謝您提供任何幫助。

回答

5

你的錯誤實際上是一個經典的內存分配錯誤。這:

MY_GATEWAY = [NSMutableString stringWithString:MY_PROTOCOL]; 

創建一個自動釋放並設置MY_GATEWAY指向它。你實際上並不擁有這個字符串,所有你保證的是它至少會持續到調用堆棧。所以自動釋放對象通常用於從函數返回結果或創建臨時對象,而不必明確地擔心所有權。

當你的第二個線程訪問MY_GATEWAY時,原始字符串已被釋放,並且只是巧合地將一些其他對象放在同一地址。

你想要做的是:

MY_GATEWAY = [[NSMutableString alloc] initWithString:MY_PROTOCOL]; 

新的,分配的任何電話,或保留在名稱創建給你一個擁有引用。當你擁有一個擁有的引用時,你肯定知道這個對象會一直存在,直到你明確地釋放它爲止。

內存管理規則的官方指南是hereThis blog post也很有用。

如果你不擔心內存管理,蘋果已經宣佈iOS 5的工具版本將能夠爲你處理大部分這些問題。具體細節在NDA之下,但如果您使用開發者計劃帳戶登錄Apple的開發者網站,那麼您可以獲得下一版工具和相關文檔的beta版。注意引用自動引用計數(或ARC)。

+0

謝謝湯米。你完全正確,解決了這個問題。 – JohnRock

1

MY_GATEWAY = [[NSMutableString stringWithString:MY_PROTOCOL] retain]; 

否則你MY_GATEWAY字符串被自動釋放。