2014-01-09 55 views
0

編輯:這是用於靜態NSMutableDictionary,而不是類成員。我看到很多答案認爲這是班級成員,對此抱歉。感謝您的快速回復。使用Arc不保留函數參數?

我的代碼工作的一塊,但它使用了2倍,所以我寫了一個方便的功能:

- (void) initializeDictionary:(NSMutableDictionary*)mutableDict fromPathName:(NSString*)path 
{ 
    mutableDict = // get from file, init if not there. 
} 

然後我注意到什麼也沒有保存。逐句通過代碼,該函數創建一個字典,但「傳入」值在返回時仍爲零。這完全吹走了我對指針的理解(不要採取這種錯誤的方式,我很舒服)。但我認爲,他們的目的是讓你「通過地址」,這樣我就可以爲它指向的東西提供保溼。

由於mutableDict是「值副本」,因此ARC似乎將其擦除。我在這裏問,因爲

  1. 其他問題有相反的問題「爲什麼這被保留?」和
  2. 它看起來不正確。任何指針語言的第一個教程是「所以你可以混淆原始值」。 Arc是否真的這樣做?有沒有一個概念我沒有得到?

當然,我可能會忽略一些簡單的東西。

我似乎做回寫把戲,我發現其他地方已經解決了它:

- (void) initializeDictionary:(NSMutableDictionary* __strong *)mutableDictionary fromPath:(NSString*)path; 

,並使用&打電話* DEREF更改值。它似乎遠不如優雅。

回答

2

你傳遞一個指針NSDictionary。如果你改變指針值mutableDict(通過分配或賦值),這將不會反映在作爲此函數參數傳遞的變量上,並且由於mutableDict在函數中被本地定義,所以它將自動被ARC釋放。 (不要忘記,即使是指針,地址在傳遞給函數時也會被複制)。

您的第二個解決方案的工作原因是因爲您將指針傳遞給指針(不確定是否需要強大的指針)。由於您更新了mutableDict指向的地址中的值,所以*mutableDict的值將反映到外部。這個值是你分配的字典的地址,因爲你通過指針改變它,它會反映在函數之外。

+0

謝謝,我覺得愚蠢,不知何故忘了目標C的語法是乾淨的,並掩蓋自動引用。隨着ARC的進展,我會對ARC感到滿意......只是爲了避免它一段時間,因爲我做了Core的東西。 –

0

在Objective-C中,如果您在方法中定義了一個變量,該變量僅在該方法中可見。

如果您需要保存變量以在外部使用它,則需要從函數中「返回」它。你所做的不是一招,是另一種返回變量的方式。

嘗試:

- (void)initializeDictionaryFromPath:(NSString*)path { 
    NSMutableDictionary *mutableDict = // your initialization 
    return mutableDict; 
} 

然後,你可以定義你的詞典與此代碼:

NSMutableDictionary *mutableDict = [self initializeDictionaryFromPath:path]; 
2

,做你想做你使用多個間接

- (void) initializeDictionary:(NSMutableDictionary**)mutableDict fromPathName:(NSString*)path 
{ 
    mutableDict = // get from file, init if not there. 
} 

注意參數是什麼是(NSMutableDictionary **),一個指向NSMutableDictionary指針的指針。

要叫你需要創建一個指針,並通過它在這樣的方法:

NSMutableDictionary *mutableDictionary; 
[self initializeDictionary: &mutableDictionary fromPathName:...]; 

並在返回時,mutableDictionary變量已經被初始化的方法。

但是,從方法中返回字典可能更容易,而不是這樣做。

+0

我的最後一段代碼顯示了我是這樣做的......我的問題是如果這是唯一的方法,因爲它使基本操作變得複雜。我們不符合語言,我們符合ARC不理解。 –

+0

啊,我只記得,Objective [C]的指針幾乎都是自動解除引用的,因爲[]的語法處理消息的東西。嘎,我知道那會讓我有一天。謝謝。 –

+0

這是一個非常普遍的做法。甚至有一個命名約定,說這樣的方法應該以'get'開頭,查看'UIColor'中的方法,通過引用來初始化'r','g','b'值。它在這裏過於複雜,因爲更好(恕我直言)只編寫一個方法,從方法返回一個初始化的值。 – Abizern