在iphone上坠毁但在模拟器上没有坠毁

时间:2009-11-21 16:09:43

标签: iphone crash ios-simulator

找出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

4 个答案:

答案 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之间的区别;明智地使用它们。谢谢你的回复。

韦恩