gritsch schrieb:
mir ist grad eingefallen dass zwischen ARC und MRC zur laufzeit ja gar nicht unterschieden werden kann. also fliegen mit convenience-constructor erstellte objekte immer in den ARP.
Das ist auch nicht ganz richtig. Clang fügt Paare von objc_autoreleaseReturnValue und objc_retainAutoreleasedReturnValue ein, wenn die sowohl im aufrufenden als auch im aufgerufenen Code sind wird der Autorelease Pool umgangen. Das ist aber ein Implementationsdetail das einen eigentlich nicht kümmern sollte.
Apple Inc. schrieb:
objc_autoreleaseReturnValue() examines the caller's instructions following the return. If the caller's instructions immediately callobjc_autoreleaseReturnValueobjc_retainAutoreleasedReturnValue, then the callee omits the -autorelease and saves the result in thread-local storage. If the caller does not look like it cooperates, then the callee calls -autorelease as usual.
objc_autoreleaseReturnValueobjc_retainAutoreleasedReturnValue checks if the returned value is the same as the one in thread-local storage. If it is, the value is used directly. If not, the value is assumed to be truly autoreleased and is retained again. In either case, the caller now has a retained reference to the value.
Allerdings natürlich ein Zeichen, dass der Compiler effizienter ist als händische Zählung, es sein denn man verletzt die Basic Memory Management Rules und macht seinen Code unwartbar für Andere.
Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von SteveJ ()