私は非常に単純なクラス(現在テストクラスとして使用されています)を持っています。これは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
これをブロックベースの関数に変換するにはどうすればよいですか? また、ブロック関数を実装する際に「保持サイクル」に注意する必要があることも知っています。このクラスをデリゲート/プロトコルの代わりにブロックを使用するように変換する場合、何に注意する必要がありますか? 「保持サイクル」をグーグルで検索すると、非常に複雑な答えが得られます。
出発点はありますか?