8

Assume

typedef void (^MyResponseHandler) (NSError *error);
@property (strong, nonatomic) MyResponseHandler ivarResponseHandler;
synthesize ivarResponseHandler = _ivarResponseHandler;

- (void)myMethod:(MyResponseHandler)responseHandler
{
    self.ivarResponseHandler = responseHandler;
    ...
}

Is the assignment to the ivar through the @property correct? I know that in manual memory management you would have needed self.ivarResponseHandler = [responseHandler copy]; to make sure the block was copied from the stack to the heap. But watching Session 322 - Objective-C Advancements in Depth (minute 25) from WWDC 2011, the speaker says that ARC automatically handles the assignment of a block to an ivar. I just wanted to make sure.

4

2 に答える 2

11

ARC、投稿したコードで自動的にコピーを実行します。

ブロックをに変換するとid、ARCはコピーを実行しませんたとえば、このコードでは、addObject:引数のタイプがid:であるため、ARCはコピーを実行しません。

NSMutableArray *array = [NSMutableArray array];
[array addObject:responseHandler];
于 2012-05-02T16:35:28.957 に答える
2

クマ山、

ブロックが確実にコピーされるようにする最も簡単な方法は、実際には、@propertyコピーを使用するように設定することです。次のように:

@property (copy, nonatomic) MyResponseHandler ivarResponseHandler;

それはあなたが必要とするすべてを行います。

アンドリュー

于 2012-05-04T13:06:02.713 に答える