Я делал некоторые тесты с указателями в Swift и хотел проверить, что объекты, которые я принимал указатели, не сохранялись.Почему Swift «Managed.fromOpaque.takeUnretainedValue()« сохраняет значение?
func test1(){
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passUnretained(str).toOpaque()
print(CFGetRetainCount(str))
let str2 = Unmanaged<aaa>.fromOpaque(ptr1).takeUnretainedValue();
print(CFGetRetainCount(str2))
}
В результате получается 2,2,3. Поэтому «passUnretained» не сохранялся, но «takeUnretainedValue» сделал.
Изменение на «takeRetainedValue» устраняет проблему и вызывает ожидаемый сбой. Выход 2,2,2.
func test1(){
let str = aaa();
print(CFGetRetainCount(str))
let ptr1 = Unmanaged.passUnretained(str).toOpaque()
print(CFGetRetainCount(str))
let str2 = Unmanaged<aaa>.fromOpaque(ptr1).takeRetainedValue();
print(CFGetRetainCount(str2))
}
Итак, в заключение, «takeRetainedValue» НЕ сохраняет значение.
Обновление: Я отредактировал этот вопрос, чтобы удалить некоторые ранее запутанные утверждения и вернул его в основной вопрос программирования.
Да. Я понял первоначальный вопрос. «passUnretained» не сохраняется, но «takeUnretainedValue» делает. Но это не связанные пары, но passUnretained (+0) противопоставляется passRetained (+1). Как вы думаете, я должен просто удалить эту проблему, поскольку нет никакого обоснования или нет проблемы с кодированием? – user1122069
Я рад, что это имеет смысл для вас. Не саркастично. Важно понимать, что означают термины, чтобы правильно использовать их и иметь возможность просматривать код. – user1122069