【问题标题】:sortedArrayUsingSelector causing SIGABRTsortedArrayUsingSelector 导致 SIGABRT
【发布时间】:2014-02-10 16:45:49
【问题描述】:

我正在使用 sortedArrayUsingSelector 对我拥有的数组进行排序。

这是我的称呼:

NSArray *sortedArray;
SEL sel = @selector(intSortWithNum1:withNum2:withContext:);
sortedArray = [_myObjs sortedArrayUsingSelector:sel];

这是定义:

- (NSInteger) intSortWithNum1:(id)num1 withNum2:(id)num2 withContext:(void *)context {
    CLLocationCoordinate2D c1 = CLLocationCoordinate2DMake([((myObj *)num1) getLat], [((myObj *)num1) getLong]);
    CLLocationCoordinate2D c2 = CLLocationCoordinate2DMake([((myObj *)num2) getLat], [((myObj *)num2) getLong]);

    NSUInteger v1 = [self distanceFromCurrentLocation:(c1)];
    NSUInteger v2 = [self distanceFromCurrentLocation:(c2)];
    if (v1 < v2)
        return NSOrderedAscending;
    else if (v1 > v2)
        return NSOrderedDescending;
    else
        return NSOrderedSame;
}

当我运行我的应用程序时,我的主程序中出现 thread1 SIGABRT 错误。

有什么想法吗?提前致谢。

注意:我已经尝试过了:

NSArray *sortedArray = [[NSArray alloc] init];

它没有解决任何问题。

【问题讨论】:

  • 你能添加堆栈跟踪吗? thread1 SIGABRT 没说太多..(至少对我来说)
  • 如何在 XCode 中获取堆栈跟踪?
  • 应用崩溃后的控制台输出

标签: ios objective-c xcode ios7 nsarray


【解决方案1】:

选择器应该由被比较的对象实现,并且应该只接受一个参数,该参数是另一个相同类型的对象。

例如,在NSArray 中,有一个使用 caseInsensitiveCompare 比较字符串的示例。那是因为 NSString 实现了 caseInsensitiveCompare。

如果您考虑一下... sortedArrayUsingSelector 怎么知道在您的示例中将什么作为参数传递给函数??

编辑: 这意味着您用作“排序选择器”的函数必须是由数组中的对象定义的函数。假设如果你的数组包含 Persons,你的数组必须像这样排序:

sortedArray = [_myObjs sortedArrayUsingSelector:@selector(comparePerson:)];

comparePerson 消息将发送到您的数组 (Persons) 中的对象,因此在您的 Person 类中,您必须有一个名为 comparePerson 的函数:

- (NSComparisonResult)comparePerson:(Person *)person
{
    if (self.age == person.age)
        return NSOrderedSame;
}

在此示例中, comparePerson 将自身 (self) 与参数 (person) 进行比较,如果两个人的年龄相同,则认为他们相等。如您所见,只要您编写了正确的逻辑,这种比较和排序的方式就非常强大。

【讨论】:

  • “比较器消息被发送到数组中的每个对象,并将数组中的另一个对象作为其单个参数。”(来自developer.apple.com/library/ios/documentation/cocoa/reference/…
  • 对象必须实现选择器是什么意思?从字面上看,myObj 应该是 myObj 实现 Selector?
  • 谢谢,我会试一试!
猜你喜欢
  • 2012-07-07
  • 1970-01-01
  • 2016-11-04
  • 2011-07-03
  • 1970-01-01
  • 2018-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多