找出 iPhone 和模拟器之间的许多差异确实令人难以置信。我花了几个小时试图弄清楚为什么我的应用程序在模拟器上运行但在我的 iPhone 设备上崩溃了。事实证明罪魁祸首是sortedArrayUsingDescriptors。还有这样的get-you吗?请与我分享。
与您分享该问题和修复方法:
<小时/>代码在 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]
;
修复方法是创建一个数组来存储它:
NSArray* descriptorArray = [[NSArray alloc] initWithObjects:countDescrp, nil];
aSortedNsArray = [anNsArray sortedArrayUsingDescriptors:descriptorArray];
最佳答案
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: (自动释放) 或 initWithObject: (手动) 只是分配 NSArray 对象的不同方式。正常情况下不会导致崩溃。因为你关心的是sortedArray不保留描述符数组对象。
关于iphone - 在 iPhone 上崩溃,但在模拟器上没有崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1775890/