I was doing some tests with pointers in Swift, and wanted to verify that the objects that I was taking pointers of were not being retained.
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))
}
The result is 2,2,3. So "passUnretained" did not retain, but "takeUnretainedValue" did.
Changing to "takeRetainedValue" fixes the issue, and causes the expected crash. Output 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))
}
So, to conclude, "takeRetainedValue" does NOT retain the value.
Update: I've edited this question to remove some previously confusing statements and returned it to a basic programming question.