2010-07-21 77 views
0

我有這個非常奇怪的問題,我是新來的Objective-C,它可能來自我不理解的深度。NSString意外地變成__NSCFDictionary

所以,在我的頭文件我聲明變量

NSString *curTitle; 

然後在.m文件我合成它:

curTitle = [[NSString alloc] init]; 

後,在其他方法我給它分配:

curTitle = string; // string is an instance of NSString 

並在我試圖分配的一天結束時

slide.title = curTitle; //slide is a managed object (CoreData) 

我得到這個錯誤:***終止應用程序,由於未捕獲的異常'NSInvalidArgumentException',原因:'不可接受的屬性類型的屬性:property =「title」;期望的類型= NSString;給定類型= __NSCFDictionary;值= { }。'

有趣的事實是,在iPhone SDK 3.2,它的工作,但在我安裝SDK 4我有這樣的錯誤

另一個有趣的事實是,如果讓我班裏的curTitle財產(含@property和@synthesize)也作品

任何想法? 謝謝

+0

再次檢查您的代碼。這種事情經常發生在我身上,而這總是我的錯。檢查所有curTitle的assingments。 – tadejsv 2010-07-21 12:35:12

回答

5

當一個對象似乎改變類時,它幾乎總是因爲它已被釋放,而另一個對象現在駐留在相同的內存位置。所有對象變量實際上是指針到內存位置(這就是*的含義),並且與許多其他語言不同,您必須始終記住您正在處理內存位置。 (好吧,並不總是,一旦你掌握了它,但肯定是在你調試的時候)。

要調試這些問題,使用NSZombie可能非常有用。只需搜索SO或網上的信息。

then in .m file I synthesize it: curTitle = [[NSString alloc] init];

這是合成。你在這裏做的只是給變量賦值。更確切地說,你在內存中創建一個對象(alloc)並初始化它(init),然後你設置curTitle的值指向那個內存位置。

根本沒有必要在您的代碼中包含此行。

curTitle = string;

這裏你覆蓋curTitle的指針另一個串舊值。你的問題很可能是其他字符串後來被解除分配,並且內存位置被重用來保存另一個對象(在這種情況下是一個字典)。 (如果您不知道保留/釋放機制,則需要閱讀這些機制以瞭解發生的情況。)

slide.title = curTitle;

curTitle由於指向的存儲器位置已被重新用於保持隨機對象(或者更糟:垃圾)這條線將失敗。事實上,你很幸運,它失敗了,因爲如果它沒有(如果該位置還沒有被重用),它將更難以發現錯誤。

你應該做的是通過屬性申報了財產,然後合成它和訪問的變量:

self.curTitle = aString;

這將確保你確實複製和繩子的所有權所以即使原始字符串被釋放,你仍然會有一個有效的副本。

+0

謝謝Felixyz很多回答這個問題 你說得對,我的'string'變量被釋放,所以我解決了它的變化 curTitle = string; 與 curTitle = [string copy]; 你可以請我解釋一下,或者在我應該使用財產時給予一些參考,當我不應該? 非常感謝您的幫助)) – Burjua 2010-07-21 15:52:15

+0

@Aristarh:curTitle = [string copy];問題是,現在你有一個保留的字符串副本,如果你稍後沒有釋放它,你將會發生內存泄漏。這就是爲什麼理解內存處理規則至關重要:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmObjectOwnership.html 有很多關於SO的信息: http:///stackoverflow.com/questions/3266467/what-exactly-does-synthesize-do/3269636#3269636 http://stackoverflow.com/questions/2423990/memory-management-in-objective-c/ – Felixyz 2010-07-21 17:14:35

+0

是的,我明白這個,但是我明白這個屬性也需要在dealloc類中釋放,所以我無法理解這個aproaches的區別,對不起(( – Burjua 2010-07-22 08:44:46