找出iphone和模拟器之间的许多差异真是令人难以置信。我花了几个小时试图找出我的应用程序在模拟器上运行但在我的iphone设备上崩溃的原因。事实证明,罪魁祸首是sortedArrayUsingDescriptors。还有更多 - 你喜欢这个吗?请与我分享。
与您分享有关问题和修正的信息:
代码在iphone上崩溃但不是模拟器
NSSortDescriptor* aDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"count" ascending:NO] autorelease];
NSArray* anNsArray = [[NSArray alloc] init];
NSArray* aSortedNsArray = [[NSArray alloc] init];
aSortedNsArray = [anNsArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:aDescriptor]];
问题出在[NSArray arrayWithObject:aDescriptor]
;
修复方法是创建一个Array来存储它:
NSArray* descriptorArray = [[NSArray alloc] initWithObjects:countDescrp, nil];
aSortedNsArray = [anNsArray sortedArrayUsingDescriptors:descriptorArray];
Wayne in Campbell,CA
答案 0 :(得分:3)
发布的代码不会崩溃。虽然有几个泄漏的对象,但它不会在模拟器上崩溃,也不会在设备上崩溃。
我认为,你的问题在其他地方。尝试使用新项目缩小范围并仅复制可疑代码。
答案 1 :(得分:2)
尼古拉
当我的应用程序简单而小巧时,它没有崩溃。这可能与本文所述的自动释放和释放有关:http://kosmaczewski.net/2009/01/28/10-iphone-memory-management-tips/作者指出另一个但类似的问题:
“我确信你在使用NSDictionary的dictionaryWithObjects:forKeys时遇到了应用程序崩溃:然后发现用initWithObjects代替了它:forKeys:让你的应用程序运行得很好。”
使用[NSArray arrayWithObject:aDescriptor],使用autorelease创建NSArray;相反,使用[[NSArray alloc] initWithObjects:countDescrp,nil]特别需要何时释放NSArray。
代码的简单更改使我的应用程序在iphone上没有100%崩溃,而旧代码使应用程序100%的时间崩溃。
答案 2 :(得分:1)
NSSortDescriptor* aDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"count" ascending:NO] autorelease];
NSArray* anNsArray = [[NSArray alloc] init];
NSArray* aSortedNsArray = [[NSArray alloc] init];
aSortedNsArray = [anNsArray sortedArrayUsingDescriptors:[NSArray arrayWithObject:aDescriptor]];
这是一个错误的初始化机制,如果代码片段已完成,则问题出在空的anNsArray对象上。
您也不需要初始化aSortedNsArray。
所以它应该是:
NSSortDescriptor* sortDescriptor = [[[NSSortDescriptor alloc] initWithKey:@"count" ascending:NO] autorelease];
// Assume you return it as array of objects from a property or method
NSArray *array = [self objects];
NSArray *sortedArray = nil;
if ([array count] > 0) {
sortedArray = [array sortedArrayUsingDescriptors:[NSArray arrayWithObject:sortDescriptor]];
}
// Then you check the sortedArray
if (sortedArray == nil || [sortedArray count] == 0)
[self somethingIsWrong];
arrayWithObject :( autoreleased)或initWithObject :( manual)只是分配NSArray对象的另一种方式。它不会导致正常崩溃。因为你关心的是sortedArray不保留描述符数组对象。
答案 3 :(得分:0)
尼古拉
你可能是对的。大多数编码人员都很难排除使用Objective C导致内存管理不良的可能性。如果我发现了其他真正的潜在错误,我会在这里进行更新。在平均时间内,我会提醒编码人员注意arraywithobjects和initwithobjejcts之间的区别;明智地使用它们。谢谢你的回复。
韦恩