Почему NSObject () == NSObject () ложно, а ObjectIdentifier (NSObject ()) == ObjectIdentifier (NSObject ()) истинно? - PullRequest
4 голосов
/ 04 августа 2020

Swift-код

print("1", NSObject() == NSObject())
print("2", ObjectIdentifier(NSObject()) == ObjectIdentifier(NSObject()))
let object3 = NSObject()
let object4 = NSObject()
print("3", object3, object4)
print("4", ObjectIdentifier(object3) == ObjectIdentifier(object4))

Результат в консоли

1 false
2 true
3 <NSObject: 0x600000d805f0> <NSObject: 0x600000d80610>
4 false

ObjectIdentifier сравнивает экземпляры, используя их идентификаторы объектов и оператор «идентичный» ===. Почему NSObject () в print ("1", ...) - это два объекта, а в print ("2", ...) - тот же объект?

1 Ответ

4 голосов
/ 04 августа 2020

Гипотеза:

Первый NSObject выпускается немедленно после получения идентификатора (оценивается как часть левой части ==), а второй NSObject «занимает его место. ”И ему назначается тот же внутренний адрес-aka-ID, так что следующий ObjectIdentifier возвращает тот же идентификатор.

Выпуск не может произойти в случае NSObject () == NSObject (), поскольку объект (не идентификатор из оценки) используется в самом операторе сравнения. Освобождение также не может произойти, если объект привязан к локальной переменной.

Гипотеза может быть аргументирована, учитывая следующее:

 let x1 = ObjectIdentifier(NSObject()) // NSObject #1 released
 let x2 = ObjectIdentifier(NSObject()) // Do we get same ID here?
 print("x", x1, x2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...