From the assembly code it can be seen that accessing weakPtr
generates a objc_loadWeak
call.
According to the Clang documentation, objc_loadWeak
retains and autoreleases the object and is equivalent to
id objc_loadWeak(id *object) {
return objc_autorelease(objc_loadWeakRetained(object));
}
This (hopefully) explains why both
if(strongPtr == weakPtr) ...
and
NSLog(@"weakPtr: %@", weakPtr);
create additional autoreleased references.
This is not a special NSString
problem, I could reproduce the same behaviour with a custom (plain) class.