代码之家  ›  专栏  ›  技术社区  ›  Wayne Lo

在iPhone上崩溃,但不在模拟器上

  •  2
  • Wayne Lo  · 技术社区  · 15 年前

    发现iPhone和模拟器之间的许多差异真是令人难以置信。我花了几个小时试图弄明白为什么我的应用程序在模拟器上运行,但在我的iPhone设备上崩溃了。事实证明,罪魁祸首是排序和排序描述符。还有更多像这样的吗?请和我分享。

    与您分享问题和修复方法:


    代码在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];
    

    韦恩在坎贝尔,加利福尼亚州

    4 回复  |  直到 14 年前
        1
  •  1
  •   Jesse Armand    14 年前
    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:(autoreleated)或initWithObject:(manual)只是分配nsarray对象的另一种方法。正常情况下不会造成撞车。因为您关心的是SortedArray不保留描述符数组对象。

        2
  •  3
  •   Nikolai Ruhe    15 年前

    发布的代码不会崩溃。虽然有一些泄漏的物体,但它不会在模拟器上或设备上崩溃。

    我想,你的问题在别处。尝试使用新项目缩小范围,只复制可疑代码。

        3
  •  2
  •   Wayne Lo    15 年前

    尼古莱

    当我的应用程序很简单很小时,它没有崩溃。这可能与本帖所述的自动释放有关: http://kosmaczewski.net/2009/01/28/10-iphone-memory-management-tips/ 作者指出了另一个类似的问题:

    “我确信您在使用nsdictionary的dictionary withobjects:forkeys:然后发现用initWithobjects:forkeys:替换initWithobjects:forkeys:使您的应用程序运行正常时,遇到了应用程序崩溃的情况。”

    使用[nsarray arraywithobject:adescriptor]创建nsarray时使用了autorelease;相反,使用[nsarray alloc]initwitobjects:countdescrp,nil]需要在释放nsarray时特别指定。

    代码的简单更改使我的应用程序在iPhone上不会100%崩溃,而旧代码使应用程序100%崩溃。

        4
  •  0
  •   Wayne Lo    15 年前

    尼古莱

    你可能是对的。大多数编码人员很难排除使用目标C进行错误内存管理的可能性。如果我像您所猜测的那样发现了另一个真正的潜在错误,我将在这里更新。在指定的时间内,我会提醒编码人员注意arrayWithObjects和initWithObjectJCT之间的区别;明智地使用它们。感谢您的回复。

    韦恩