为什么在这种情况下,UniquelyReferencedNonObjC返回false?

Roy*_* Li 3 memory-management ios automatic-ref-counting swift

我正在研究引用计数如何在Swift中工作.在下面的代码片段中,我实例化了一个全新的Person对象,并检查它是否被唯一引用.我认为它是唯一引用的,因为它只保留在"人"实例上.但是,isUniquelyReferencedNonObjC函数返回false.

谁能解释为什么会这样?

func application(application: UIApplication, didFinishLaunchingWithOptions launchOptions: [NSObject: AnyObject]?) -> Bool {

    var person = Person()

    // this will output not unique
    if isUniquelyReferencedNonObjC(&person) {
        println("unique")
    } else {
        println("not unique")
    }

    return true
}
Run Code Online (Sandbox Code Playgroud)

人员类:

class Person: NSObject {

}
Run Code Online (Sandbox Code Playgroud)

编辑有趣的是,当我不使Person成为NSObject的子类时,isUniquelyReferencedNonObjC将按预期返回true.但是,我仍然不明白为什么子类化NSObjct会在这里产生影响.

提前致谢.

Mar*_*n R 5

isUniquelyReferencedNonObjC 记录为

/// Returns `true` iff `object` is a non-\ `@objc` class instance with
/// a single strong reference.
/// ...
/// * If `object` is an Objective-C class instance, returns `false`.
/// ...
Run Code Online (Sandbox Code Playgroud)

你的Person类继承自NSObject,因此 isUniquelyReferencedNonObjC(&person)返回false.

  • @Vyacheslav:根据 https://github.com/apple/swift-evolution/blob/master/proposals/0125-remove-nonobjectivecbase.md,它被重命名为(或替换为)[isKnownUniquelyReferenced](https:// developer.apple.com/documentation/swift/2430721-isknownuniquelyreferenced)。但是,它确实 *“...不再承诺为 `@objc` 类实例返回 false”*,因此这个答案可能需要更新。 (3认同)