我有這樣的方法:什麼是從autoreleasepool塊內設置NSError outparam的正確方法?
- (void)processAThing:(id)thing error:(NSError * __autoreleasing *)error
{
@autoreleasepool {
// Start processing.
// Find some partway through error..
if (error) {
*error = [NSError errorWithDomain...];
return NO;
}
// More processing.
}
}
這是破碎和崩潰,因爲NSError會被自動釋放,並返回,這時,池排出,使主叫方獲得的東西現在是僞造的。
我知道我可以大大地重新設計方法,所以我收集autorelease塊之外的所有錯誤情況,但我想了解在這種情況下是否有正確的方式來處理錯誤對象。我不能在池塊之外分配/初始化一個推測的NSError,因爲域和代碼屬性是隻讀的(我仍然認爲當方法返回時引用會消失)。
它解決了問題,如果我改變了方法聲明如下:
- (void)processAThing:(id)thing error:(NSError * __strong *)error
但後來我需要在一個非標準的方式調用點大驚小怪左右,這似乎令人震驚,使主叫方支付價格爲我的內部autoreleasepool。
有什麼想法?謝謝。
將簽名更改爲「(NSError * __strong *)錯誤」實際上似乎是對我來說合理的選擇。 – Poulsbo