Spa*_*Dog 11 iphone objective-c-blocks
我试图了解如何在iOS上使用块.我读过Apple的文档但是,像往常一样,它们含糊不清,并且没有提到几个重要的信息.我也搜索过没有成功.这就是我想要做的练习,以便理解这一点.
我创建了一个块来读取字符串并将字符串与之前的读取进行比较.如果字符串不相同,则返回YES,如果它们相同,则返回NO.
这就是我做的:
我在.h上宣布这个
BOOL (^differentStrings)(void);
Run Code Online (Sandbox Code Playgroud)
我在.m中声明了这个,在viewController中的viewDidLoad中
__block NSString * previousString;
__block NSString * currentString;
differentStrings = ^(void){
currentString = [self getString];
NSLog(@"%@", currentString); // not printing anything on console
if (![currentString isEqualToString:previousString]) {
previousString = currentString;
return YES;
} else {
return NO;
}
};
Run Code Online (Sandbox Code Playgroud)
这就是我的用法:我有一个线程可以做到这一点:
if (differentStrings)
NSLog (@"strings are different);
Run Code Online (Sandbox Code Playgroud)
这些是我遇到的问题:
你能帮助我吗?
BJ *_*mer 15
你误解了块是如何工作的.(好吧,这很明显.)与previousString
指向NSString的变量相同,differentStrings
是指向块的变量.不是运行块的结果,而是块本身.也就是说,在你这样做之后:
__block NSString * previousString;
__block NSString * currentString;
differentStrings = ^(void){
currentString = [self getString];
NSLog(@"%@", currentString); // not printing anything on console
if (![currentString isEqualToString:previousString]) {
previousString = currentString;
return YES;
} else {
return NO;
}
};
Run Code Online (Sandbox Code Playgroud)
differentStrings
是一个指向块的变量.因此,当你这样做时:
if (differentStrings)
Run Code Online (Sandbox Code Playgroud)
...你只是检查是否differentStrings
包含0或NULL以外的东西.由于它包含一个块,因此它不为空,因此它的计算结果为true.
记住:differentStrings
是块变量,而不是BOOL变量.它包含一个块(一个函数,如果你愿意的话),调用它时会返回一个bool.因此,为了实际运行块,您需要调用它.像这样:
differentStrings();
Run Code Online (Sandbox Code Playgroud)
或者,在您的情况下:
if (differentStrings()) {
NSLog (@"strings are different");
}
Run Code Online (Sandbox Code Playgroud)
编辑:正如注释中所指出的那样,因为它differentStrings
是一个实例变量,所以你需要copy
它,就像你调用retain
分配给实例变量的任何其他对象一样.(由于技术原因,我不会去到现在,你应该总是使用copy
与块代替retain
).同样,你需要调用release
一些点以后,也许在你的dealloc
方法.
归档时间: |
|
查看次数: |
9952 次 |
最近记录: |