3

私は非常に単純なクラス(現在テストクラスとして使用されています)を持っています。これはdelegate/protocolメソッドを使用してその親クラスとインターフェースします。しかし、私は本当にこれを変換して使用したいと思っていますblocks。それでも、これを行う方法を理解するのに役立つ優れたリソースやチュートリアルが見つかりません。すべてのブロックのチュートリアルは複雑すぎます。これを行う方法の小さくて簡潔な例が本当に欲しいです。

私は現在クラスを持っています:

#import <Foundation/Foundation.h>

@protocol TestObjectDelegate <NSObject>

@optional
-(void)testObjectSucceeded:(BOOL)passedTest;
-(void)testObjectedFailed:(NSError *)error;
@end

@interface TestObject : NSObject {
    id<TestObjectDelegate> _delegate;
}
-(void)compare:(NSString *)stringA with:(NSString *)stringB;

@end


#import "TestObject.h"



@implementation TestObject 

- (id)initWithDelegateController:(id<TestObjectDelegate>)delegate {
    self = [super init];
    if (self) {
        _delegate = delegate;
    }
    return self;
}

-(void)compare:(NSString *)stringA with:(NSString *)stringB {
    if ([stringA isEqualToString:stringB]) {
        if(_delegate && [_delegate respondsToSelector:@selector(testObjectSucceeded:)]) {
            [_delegate testObjectSucceeded:YES];
        }
        else {
            [_delegate testObjectSucceeded:NO];
        }
    }
    else {
        if(_delegate && [_delegate respondsToSelector:@selector(testObjectedFailed:)]) {
            [_delegate testObjectedFailed:nil];
        }
    }
}
@end

これをブロックベースの関数に変換するにはどうすればよいですか? また、ブロック関数を実装する際に「保持サイクル」に注意する必要があることも知っています。このクラスをデリゲート/プロトコルの代わりにブロックを使用するように変換する場合、何に注意する必要がありますか? 「保持サイクル」をグーグルで検索すると、非常に複雑な答えが得られます。

出発点はありますか?

4

1 に答える 1

5

たぶん、この例はあなたにアイデアを与えるでしょう:

typedef void (^MyCallbackBlock)(BOOL);

@interface TestObject : NSObject {

}
@property (nonatomic, copy) MyCallbackBlock myBlock;
@end




#import "TestObject.h"

@implementation TestObject 

-(void) yourMethod
{
    ...
        self.myBlock(YES); // call block with argument
    ...
}

- (void)dealloc 
{
    [myBlock release];   
    myBlock = nil;
    [super dealloc];
}

@end

オブジェクトを使用する場合、次のようにブロックを定義できます。

TestObject* theTestObject = [[TestObject alloc] init];
theTestObject.myBlock = ^(BOOL theParameter){
    NSLog(@"foo");
};
于 2012-08-14T11:31:35.323 に答える