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 回答