kba*_*man 6 iphone objective-c iphone-sdk-3.0
我的iPhone应用程序一直在崩溃,在过去的血腥周中我将它缩小到这一行:
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
Run Code Online (Sandbox Code Playgroud)
我从上面得到了正确的结果,但应用程序在访问它后崩溃了(EXC_BAD_ACCESS).我如何只是复制内容,fetchResults以便我可以玩它?
我试过了
NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults];
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]];
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]];
Run Code Online (Sandbox Code Playgroud)
但唯一不会使应用程序崩溃的是
NSArray *retVal = [[NSArray alloc] initWithArray:nil];
Run Code Online (Sandbox Code Playgroud)
有人可以帮帮我吗?我想我需要上Obj-C内存管理课程.
编辑: 这是一个更完整的崩溃代码示例:
NSArray *fetchResults = [managedObjectContext executeFetchRequest:request error:&error];
[request release];
NSMutableArray *retVal = [NSMutableArray arrayWithCapacity:0];
for(Job *job in fetchResults){
//NSLog(@"dev: %@",job.lastmod_device);
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:
[job.jobkey copy], @"entitykey",
[NSNumber numberWithInt:[job.lastmod_device timeIntervalSince1970]], @"job_lastmod_device",
[NSNumber numberWithInt:[job.lastmod_server timeIntervalSince1970]], @"job_lastmod_server",
[NSNumber numberWithInt:[job.customer.lastmod_device timeIntervalSince1970]], @"customer_lastmod_device",
[NSNumber numberWithInt:[job.customer.lastmod_server timeIntervalSince1970]], @"customer_lastmod_server",
[NSNumber numberWithInt:[job.productionschedule_lastmod_device timeIntervalSince1970]], @"productionschedule_lastmod_device",
[NSNumber numberWithInt:[job.productionschedule_lastmod_server timeIntervalSince1970]], @"productionschedule_lastmod_server", nil];
//NSLog(@"dict: %@", dict);
[retVal addObject:dict];
}
return retVal;
Run Code Online (Sandbox Code Playgroud)
以及调用此方法的代码:
NSArray *arr2 = [self retrieveJobs];
Run Code Online (Sandbox Code Playgroud)
(就是这样;我甚至从不使用变量)
编辑2:
即使只是用一个空的for循环迭代获取的结果而对该fetchResults对象不做任何其他操作会导致应用程序崩溃.这怎么可能呢?
bbu*_*bum 19
你在挣扎; 这些代码行......
NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults];
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults copy]];
NSArray *retVal = [[NSArray alloc] initWithArray:[fetchResults retain]];
Run Code Online (Sandbox Code Playgroud)
后两者是简单的泄漏.第一种是制作副本的一种方法,但却retVal = [fetchResults copy];是制作副本的更好方法.
但是,当然,你根本不需要副本.那不是问题.你接着说,唯一没有崩溃的是空结果集.
这表明两件事之一; 您的结果集已损坏(不太可能)或您正在错误地访问结果集(可能).
"颠簸"是你提出了一个关于崩溃的问题,但不包括崩溃的回溯或崩溃的位置.添加这些,您可能会在短时间内得到答案.
(并且不要冒犯"捶打" - 我们都这样做.即使经过20多年的Objective-C,我仍然需要面对,退后一步,思考一切,以摆脱颠簸.)
NSArray *retVal = [fetchResults retain]应该为你保留一切。它不会复制,但我认为这并不是您真正想要做的。您的第一次尝试应该复制一份。如果你不小心的话,它们都很容易泄漏(你的第二个例子肯定会泄漏)。您确定您没有在程序中执行其他操作导致这部分代码失败吗?
如果您想要的话,这里有一些进行真实副本的选项:
NSArray *retVal = [fetchResults copy];
NSArray *retVal = [[NSArray alloc] initWithArray:fetchResults];
Run Code Online (Sandbox Code Playgroud)
这两个都将保留的数组返回给您。
| 归档时间: |
|
| 查看次数: |
24355 次 |
| 最近记录: |