Ich machte einige Tests mit Zeigern in Swift und wollte überprüfen, dass die Objekte, auf die ich Zeiger nahm, nicht beibehalten wurden.Warum behält Swift "Managed.fromOpaque.takeUnletainedValue()" den Wert?
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))
}
Das Ergebnis ist 2,2,3. So wurde "passUnready" nicht beibehalten, sondern "takeUnretainedValue" tat.
Die Änderung zu "takeRetainedValue" behebt das Problem und verursacht den erwarteten Absturz. Ausgabe 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))
}
Also, um zu schließen, behält "TakeRetainedValue" nicht den Wert.
Update: Ich habe diese Frage bearbeitet, um einige zuvor verwirrende Anweisungen zu entfernen und es zu einer grundlegenden Programmierfrage zurückgegeben.
Ja. Ich habe das erste Problem herausgefunden. "passUnready" behält nicht bei, aber "takeUnretypedValue" tut es. Dies sind jedoch keine verwandten Paare, aber passUnready (+0) wird von passRetained (+1) entgegengesetzt. Denken Sie, ich sollte dieses Problem einfach löschen, da es keine mögliche Begründung oder kein Coding-Problem mehr gibt? – user1122069
Ich bin froh, dass es für Sie Sinn macht. Nicht sarkastisch sein. Es ist wichtig zu verstehen, was die Begriffe bedeuten, um sie richtig zu verwenden und Code überprüfen zu können. – user1122069