Bur*_*jua 0 iphone core-data objective-c nsstring
我有这个非常奇怪的问题,我是Objective-c的新手,它可能来自我还不理解的深度.
所以,在我的头文件中,我声明了变量
NSString *curTitle;
Run Code Online (Sandbox Code Playgroud)
然后在.m文件中我合成它:
curTitle = [[NSString alloc] init];
Run Code Online (Sandbox Code Playgroud)
在其他方法之后我分配它:
curTitle = string; // string is an instance of NSString
Run Code Online (Sandbox Code Playgroud)
在我试图分配的那天结束时
slide.title = curTitle; //slide is a managed object (CoreData)
Run Code Online (Sandbox Code Playgroud)
我收到此错误:***由于未捕获的异常'NSInvalidArgumentException'终止应用程序,原因:'属性的值不可接受的类型:property ="title"; 期望的类型= NSString; 给定type = __NSCFDictionary; value = {}.'
有趣的事实,在iphone SDK 3.2中它工作,但在我安装SDK 4后,我有这个错误
另一个有趣的事实是,如果我的类的curTitle属性(使用@property和@synthesize)它也有效
有任何想法吗?谢谢
当一个对象似乎改变了类时,它几乎总是因为它已经被释放,而另一个对象现在位于同一个内存位置.所有对象变量实际上都是指向内存位置的指针(这就是*的含义),与许多其他语言不同,您必须始终记住您正在处理内存位置.(好吧,并不总是,一旦你掌握了它.但绝对是你在调试时.)
要调试这些问题,使用起来非常有用NSZombie.只需搜索SO或网页获取信息.
然后在.m文件中我合成它:
curTitle = [[NSString alloc] init];
这不是合成.你在这里做的只是为变量赋值.更准确地说,您在内存中的某个位置创建了一个对象(alloc)并初始化它(init),然后将值设置curTitle为指向该内存位置.
您根本不需要在代码中包含此行.
curTitle = string;
在这里,您将使用指向另一个字符串的指针覆盖旧值.您的问题很可能是以后其他字符串被取消分配,并且内存位置被重用以容纳另一个对象(在这种情况下是字典).(如果您不了解保留/释放机制,则需要阅读这些以了解发生的情况.)curTitle
slide.title = curTitle;
由于curTitle指向一个已被重新用于保存随机对象的内存位置(甚至更糟:垃圾),此行将失败.事实上,你很幸运它失败了,因为如果它没有(如果该位置还没有被重用),那么检测这个bug会更加困难.
你应该做的是声明一个属性,然后合成它并通过属性访问变量:
self.curTitle = aString;
这将确保您实际复制并取得字符串的所有权,这样即使原始字符串被释放,您仍将拥有有效副本.
| 归档时间: |
|
| 查看次数: |
2235 次 |
| 最近记录: |