2010-07-21 37 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