iPhone SDK - 将基于委托的功能转换为块

时间:2012-08-14 11:14:52

标签: iphone objective-c objective-c-blocks

我有一个非常简单的类(目前用作测试类),它使用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

我怎样才能开始将其转换为基于块的功能?另外,我知道在实现块功能时需要注意“保留周期”。在将此类转换为使用块而不是委托/协议时,我需要注意什么?谷歌搜索“保留周期”也给出了一些过于复杂的答案。

任何首发指针都会受到赞赏吗?

1 个答案:

答案 0 :(得分: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");
};