代码之家  ›  专栏  ›  技术社区  ›  Piepants

是什么原因导致了这个领域的崩溃?

  •  1
  • Piepants  · 技术社区  · 6 年前

    我有一个非常偶然的领域崩溃,我自己无法复制。

    崩溃日志的回溯顶部如下所示:

    Exception Type:  EXC_CRASH (SIGABRT)
    Exception Codes: 0x0000000000000000, 0x0000000000000000
    Exception Note:  EXC_CORPSE_NOTIFY
    Triggered by Thread:  0
    
    Last Exception Backtrace:
    0   CoreFoundation                  0x181832d8c __exceptionPreprocess + 228 (NSException.m:166)
    1   libobjc.A.dylib                 0x1809ec5ec objc_exception_throw + 56 (objc-exception.mm:521)
    2   Realm                           0x10061e858 invocation function for block in objc_object* (anonymous namespace)::makeBoxedGetter<realm::StringData>(unsigned long) + 304 (RLMObject_Private.hpp:45)
    3   My App                          0x1001c239c DetailViewController.getTheTitleOfCaller() + 64 (DetailViewController.swift:1863)
    

    getTheTitleOfCaller()方法如下所示。

    func getTheTitleOfCaller() -> String
        {
            var theTitle: String = ""
            if self.caller?.name != nil
            {
                theTitle = (self.caller?.name)!
            }
            else
            {
                theTitle = "Default title"
            }
            return theTitle
    }
    

    invocation function for block in objc_object* (anonymous namespace)::makeBoxedGetter<realm::StringData>

    或者知道是什么导致了这个例外?

    1 回复  |  直到 6 年前
        1
  •  2
  •   Dávid Pásztor    6 年前

    坠机的一个可能原因是你正在处理 Optional 以不安全的方式拆开包装。您不应该使用nil检查然后强制展开,因为如果另一个线程在nil check和force unwrapping之间访问相同的变量,那么您的代码将崩溃。使用可选绑定或默认值安全展开选项。

    另一个可能的问题是使用 get ,因为Obj-C可能会误认为它们是吸气剂,这可能会导致 makeBoxedGetter 撞车。

    这个 getTitle 也可以使用默认值将函数简化为单行。我还更改了函数名,以确保问题不是由它的命名引起的。

    func title() -> String {
        return self.caller?.name ?? "Default title"
    }
    

    您还应该记住,Swift中常见的编码实践是将函数的左括号与函数声明放在同一行,for if 声明。