【问题标题】:_objc_empty_vtable The file "..." couldn't be opened because there is no such file_objc_empty_vtable 文件“...”无法打开,因为没有这样的文件
【发布时间】:2023-03-15 09:16:01
【问题描述】:

这是一个自我回答的问题。把它放在那里帮助别人。

我的应用刚刚发生了一次非常有趣的崩溃。我想做的是定义一个排序比较器,它会在模型​​中返回一个静态方法。

因此,例如,如果我的模型是 Car,并且我想按名称排序,我会在 Car.m

+ (NSComparator)nameSortAscendingComparator {
    NSComparator nameSortAscendingComparator = ^NSComparisonResult(id obj1, id obj2) {
        NSString *a = [(Car *)obj1 name];
        NSString *b = [(Car *)obj2 name] ;
        return [a compare:b] ;
    };
}

调用代码如下所示:

    NSComparator comparator = [Car nameSortAscendingComparator];
   _sortedCars = [cars sortedArrayUsingComparator:comparator];

运行它给出了一个真正的红鲱鱼异常。事实上,它看起来像这样:

断点停止:

Thread 1, Queue : com.apple.main-thread
#0  0x0231fcbc in _objc_empty_vtable ()
#1  0x0280c70a in __56-[NSArray sortedArrayFromRange:options:usingComparator:]_block_invoke_0 ()
#2  0x0273f07d in __CFSimpleMergeSort ()
#3  0x0273f124 in __CFSimpleMergeSort ()
#4  0x0273f008 in CFSortIndexes ()
#5  0x0277ad71 in -[NSArray sortedArrayFromRange:options:usingComparator:] ()
#6  0x0279a2b5 in -[NSArray sortedArrayUsingComparator:] ()

它带我去了各种各样的花园小径。块不能作为静态变量或通过静态方法访问吗?可能是在 initialize 中执行所有这些操作导致了问题?

【问题讨论】:

    标签: ios nsarray objective-c-blocks nssortdescriptor


    【解决方案1】:

    赠品是我未能发现的编译器警告。与往常一样,允许编译器警告累积可能是致命的。当问题发生时,它们会掩盖真正的问题。

    在这种情况下,它是:

    Control reaches end of non-void function
    

    是的,我的nameSortAscendingComparator 方法实际上并没有返回任何东西。嗬!问题解决了。

    我很好奇的是,晦涩的“没有这样的文件”消息背后的解释是什么?更不用说 _objc_empty_vtable。我很想了解更多关于 vtable 的信息,以及它与非 void 函数崩溃的关系。

    【讨论】:

      猜你喜欢
      • 2016-02-18
      • 2017-09-29
      • 2014-08-25
      • 2016-07-15
      • 1970-01-01
      • 1970-01-01
      • 2015-09-08
      • 2016-02-07
      • 2015-07-06
      相关资源
      最近更新 更多