從: In which situations do we need to write the __autoreleasing ownership qualifier under ARC?不使用__autoreleasing是致命的嗎?
- (BOOL)保存:(NSError * __autoreleasing *);
編譯器將不得不創建一個臨時變量,設置爲__autoreleasing。所以:
NSError * e = nil;
[ database save: &error ];
將化身:
NSError __strong * error = nil;
NSError __autoreleasing * tmpError = error;
[ database save: &tmpError ];
error = tmpError;
好了,現在轉化代碼似乎工作得很好。最後,我期望它能夠正常工作,儘管「小」(很少)有效。那麼爲什麼還要指定autoreleasing?
更確切地說,我知道當我們將指針傳遞給指針時,我們「應該」使用__autoreleasing
。 但是,如果我們得到的僅僅是一個非常輕微的性能增益,那麼有什麼意義呢?
+1但直到不清楚。所以你說我的方法無論如何都會起作用?所以如果它無論如何起作用,爲什麼還要用不同的方式來宣稱它呢?無論如何,智能編譯器也會生成高效的代碼。 – 2012-09-21 03:38:56
您的方法可以工作,因爲autoreleased臨時變量將在運行循環結束時[或之前]自動釋放,並且強引用在超出作用域[或大約]時釋放,然後該對象將被釋放。這裏重要的一點是,你正在創建保存函數將使用的*指針,所以你必須給它一個指向正確類型指針的引用。如果save函數返回如下錯誤:myError = [self save];則_it_將在內部創建指針,所以不需要臨時變量。 – Colin 2012-09-21 13:18:48
你確定代碼工作?那麼使用__autoreleasing的優勢只是一個稍微快一點的代碼? – 2012-09-22 14:32:53