почему при копировании переменной экземпляра появляется «Попытка отменить регистрацию неизвестной __слабой переменной»? - PullRequest
0 голосов
/ 19 октября 2018

Я заметил это сегодня, когда играл с NSOutlineView и NSTableHeaderCell, но когда эта конкретная конфигурация выполнена, выдается ошибка / предупреждение (?):

objc [2774]: Попытка отменить регистрацию неизвестного__слабая переменная в 0x1016070d0.Вероятно, это неправильное использование objc_storeWeak () и objc_loadWeak ().Сбой objc_weak_error для отладки.

вот фрагмент:

class Foo: NSCell {
    weak var weak: NSView?

    override func copy(with zone: NSZone? = nil) -> Any {
        // according to NSCopying documentation:
        // If a subclass inherits NSCopying from its superclass and declares
        // additional instance variables, the subclass has to override copy(with:)
        // to properly handle its own instance variables, invoking the superclass’s implementation first.
        let copy = super.copy(with: zone) as! Foo

        // this produces "Attempted to unregister unknown __weak variable"
        copy.weak = self.weak

        return copy
    }
}

let view = NSView(frame: NSRect.zero)

let foo = Foo()
foo.weak = view

let copy = foo.copy() as! Foo

это также происходит, если я заменю NSCell на: NSEvent, NSImage, NSImageCell

, но этоне бывает с NSColor, NSDate, NSIndexPath

Я начал изучать Swift без предварительного знания Obj-C.Может ли кто-нибудь помочь мне понять, почему это так?это безопасно игнорировать?кто виноват в этом деле?

1 Ответ

0 голосов
/ 26 декабря 2018

Это ошибка фреймворка.Воспроизвести с помощью следующего сбоя легко:

import Cocoa

class Cell: NSCell {
    var contents: NSString?

    override func copy(with zone: NSZone? = nil) -> Any {
        let newObject = super.copy(with: zone) as! Cell
        newObject.contents = contents
        return newObject
    }
}

func crash() {
    let cell = Cell()
    cell.contents = "hello world"
    cell.copy() // crashes while releasing the copied object
}

crash()

Если вместо этого вы используете weak var, вы получите сообщение об ошибке, которое вы показали.

У меня такое ощущение, чточто-то в copy реализации NSCell (и, возможно, NSEvent и NSImage), которое не обрабатывает подклассы для типов, имеющих нетривиальные конструкторы.Соответственно, если вы измените let newObject = super.copy(...) на let newObject = Cell(), сбой будет предотвращен.Если логика копирования вашего суперкласса достаточно проста, вам, вероятно, следует сделать это сейчас.

Если вы столкнулись с этой проблемой, вам следует подать отчет об ошибке отдельно от моего, но вы, вероятно, можете повторно использовать мой образец.

...