ブロックのハンドルを取得しようとしています。コンセプトがわかります。これらは関数ポインタに似ていますが、実際にはオブジェクトです。ブロック変数を宣言して、それにブロック値を割り当てることができます。関数のように呼び出します。用語がない、実行されるなどの理由で、「時間内に凍結」されます。いくつかのブロックを作成し、いくつかの異なる形式で正常に実行しましたが、メソッドでの使用に関しては- -typedefの有無にかかわらず--私は多くの問題を抱えています。たとえば、構文を理解するために作成したオブジェクトインターフェイスを次に示します。どうやって実装すればいいのかほとんどわかりません。
// AnObject.h
#import <Foundation/Foundation.h>
// The idea with the block and the method below is for the block to take
// an int, multiply it by 3, and return a "tripled" int. The method
// will then repeat: this process however many times the user wants via
// the howManyTimes parameter and return that value in the form of an int.
typedef int (^triple)(int);
@interface AnObject : NSObject
{
int num;
}
-(int)repeat:(int)howManyTimes withBlock:(triple)someBlock;
@end
これまでのところ、実装のために私が持っているものは次のとおりです。
#import "AnObject.h"
@implementation AnObject
@synthesize num;
-(int)repeat:(int)howManyTimes withBlock:(triple)someBlock {
for (int i = 0; i <= howManyTimes; i++) {
// What the heck am I supposed to put here? I'm baffled by the
// syntax over and over again.
}
}
@end
私はまだインスタンス変数に対処していないことを知っています。繰り返しになりますが、これは大まかなドラフトであり、ブロックがどのように機能するかを把握しようとしているだけです。私もこの方法を正しく宣言していますか?Big Nerd RanchのObjective-Cプログラミング、PragmaticStudioのブロックに関するMikeClarkの記事、およびいくつかのSOスレッドを読んでいます。関連するものが見つかりません。ありがとう。
編集:重要な場合は、XCode4.3.2。
さらに編集:わかりました。BJの(少し変更された)例を使用して、5に3を掛ける非常に複雑な方法を思いついたと思います。:)
// BJ's implementation:
-(int)repeat:(int)howManyTimes withBlock:(Triple)someBlock {
int blockReturnValue;
for (int i = 0; i <= howManyTimes; i++) {
blockReturnValue = someBlock(i);
}
return blockReturnValue;
}
主要:
...
@autoreleasepool
{
AnObject *obj = [[AnObject alloc] init];
NSLog(@"%d", [obj repeat: 5 withBlock: ^ (int number) {
return number * 3;
}]);
}
return 0;
...
そして、出力は次のとおりです。
15
引数として定義したブロックは1回だけ実行されるので、今は15をキックバックしていますよね?「数」(この場合は5)に3を掛けて、その答えをフリーズしますよね?完全に役に立たないメソッドを作成したばかりで、ブロックの利点/機能をどのように利用するかはまだわかりません。私は正しいですか?
/ * ** * ** * ** * ** * ** * ** * ** アップデート ** * ** * ** * ** * ** * ** * ** * /
更新:CRD、あなたの言っていることがわかります。ただし、これを読んでいて、別の出力を取得して「Que?」forループは次のいずれかになります。
for (int i = 0; i < howManyTimes; i++)
value = someBlock(value);
...また...
(i = 1; i <= howManyTimes; i++)
...答えを得るには243。
そして、はい、これはまさに私が最初にこのコードでやろうとしていたことです。少なくとも、それが起こっているはずだと私は思っていました。著者の意図は、数値を3倍にし、その値を格納し、格納された値を3倍にし、それを格納することなどではなく、数値1〜5(3、6、9、 12、15)。
これが完成品です。トリプラーと呼ばれる、intを取り、intを返すブロックをtypedefしました。また、引数の名前を「someBlock」から「triple」に変更して、ブロックの使用目的をより明確に示しました。コードへの変更はこれだけだと思います。
/******************** interface ********************/
#import <Foundation/Foundation.h>
typedef int (^Tripler)(int);
@interface AnObject : NSObject
-(void)iterateFromOneTo:(int)number withBlock:(Tripler)triple;
@end
/******************** implementation ********************/
#import "AnObject.h"
@implementation AnObject
-(void)iterateFromOneTo:(int)number withBlock:(Tripler)triple {
for (int i = 1; i <= number; i++) {
NSLog(@"%d", triple(i));
}
}
@end
/******************** main.m ********************/
#import "AnObject.h"
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[])
{
@autoreleasepool
{
AnObject *obj = [[AnObject alloc] init];
[obj iterateFromOneTo:5 withBlock:^(int number) {
return number * 3;
}];
}
return 0;
}
ご想像のとおり、結果の出力は次のとおりです。
2012-05-05 17:10:13.418 Untitled 2[71735:707] 3
2012-05-05 17:10:13.445 Untitled 2[71735:707] 6
2012-05-05 17:10:13.446 Untitled 2[71735:707] 9
2012-05-05 17:10:13.446 Untitled 2[71735:707] 12
2012-05-05 17:10:13.447 Untitled 2[71735:707] 15
必要以上に複雑にしていました。OPでの説明が不十分でごめんなさい。ご協力いただきありがとうございます!/スレッド?:)