我有一个非常简单的类(目前用作测试类),它使用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
我怎样才能开始将其转换为基于块的功能?另外,我知道在实现块功能时需要注意“保留周期”。在将此类转换为使用块而不是委托/协议时,我需要注意什么?谷歌搜索“保留周期”也给出了一些过于复杂的答案。
任何首发指针都会受到赞赏吗?
答案 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");
};