4

ブロックをコピーするタイミング ドキュメントによると、ブロックは「実行が定義されているスコープから戻ると削除されます。つまり、関数から直接ブロックを返すことはできません。ブロックを定義しているスコープがまだコールスタックにある間にのみブロックを使用できた場合、それらは実際ほど有用ではないでしょう。」

したがって、viewDidLoadで実行が完了するとブロックが削除されることを期待して、私が試したコードは次のとおりです。

MyReaderController.h

@interface MyReaderController : UIViewController
{
    myBlockVar aBlockVar;
}
-(myBlockVar) getABlock;
@end

MyReaderController.m

@implementation MyReaderController
- (void)viewDidLoad
{
    [super viewDidLoad];
    aBlockVar=[self getABlock];
    NSLog(@"Block Result = %f",aBlockVar(1));
}
-(void) viewDidDisappear:(BOOL)animated{
    [super viewDidDisappear:animated];
    NSLog(@"Block Exists even after the execution completes=%@ %f",aBlockVar,aBlockVar(5));
}

-(myBlockVar) getABlock{
    return ^(int var){return 4.0f;};
}

@end

したがって、このコードでは、viewDidLoad を以下のコードのように変更する必要がありますか? そうでない場合は、いつ使用する必要がありますか?

- (void) viewDidLoad{
    [super viewDidLoad];
    aBlockVar=Block_copy([self getABlock]);
    NSLog(@"Block Result = %f",aBlockVar(1));
}

パート2

後で、この次のコードを試してみましたが、viewDidDisappear で aBlockVar が nil obj として返されることを期待しています。

- (void)viewDidLoad
{
    [super viewDidLoad];
    Blocker *blocker=[[Blocker alloc] init];
    myBlockVar myVar=[blocker getABlock];
    aBlockVar=myVar;
    NSLog(@"Block Result = %f",aBlockVar(1));
    blocker=nil;
    myVar=nil;
}

ブロッカー.m

#import "Blocker.h"

@implementation Blocker

-(myBlockVar) getABlock{
    return ^(int var){return 4.0f;};
}
@end
4

4 に答える 4

5

ARCを使用していますか?その場合、Block_copyまたはを使用する必要はありませんBlock_release

もしそうなら、あなたは修正されたコードで正しいです.それをBlock_copyスタックから取り出し、有効な保持カウントが1であるヒープに入れます.またBlock_release、ブロックで最終的に終了したときに、適切な場所で呼び出す必要があります.コピーのバランスを取り、実質的に保持カウントを 0 に戻します。

于 2013-03-03T09:51:59.537 に答える
2

使用する@property (nonatomic, copy) (int)(^myBlock)(void);

システムにすべての適切なメモリ管理を任せてください!

初期化:

self.myBlock = ^int(void){
    return 4.0;
};

ブロックをどこかで破壊したい場合はself.myBlock = NULL;

于 2013-03-03T10:20:02.983 に答える
1

アークなし、アークなし:


: STACK ブロックがあり、それを HEAP ブロックとして保持したい場合 (たとえば、関数内にブロックがあり、関数を終了した後もそれを有効にしたい場合!)

次に、block_copy する必要があります。


また、NSString と同じように保持/解放する必要があります (block_copy/block_release を使用)

于 2013-03-03T10:48:02.800 に答える