我正在尝试了解如何在 iOS 上使用 block 。我已经阅读了苹果的文档,但像往常一样,它们是模糊且不完整的,并且没有提到一些重要的信息。我也用谷歌搜索过但没有成功。这就是我试图做的练习,以理解这一点。
我创建了一个 block 来读取字符串并将该字符串与之前读取的字符串进行比较。如果字符串不相同,则返回YES,如果相同,则返回NO。
我就是这样做的:
我在 .h 上声明了这一点
BOOL (^differentStrings)(void);
我在 viewController 中的 viewDidLoad 中的 .m 上声明了这一点
__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;
}
};
这就是我的使用方式:我有一个线程可以执行此操作:
if (differentStrings)
NSLog (@"strings are different);
这些是我遇到的问题:
- 该 block 始终返回 YES(字符串不同)
- 我不愿意在 videoDidLoad 中声明这一点。我应该如何声明它,以便我可以在全局范围内使用它作为方法?我应该像使用方法一样来表达它吗?
- 我正在 block 内调用方法“getString”。可以吗?
- 我觉得在 .m 上声明 block 变量很奇怪。正如我所见,我应该在 .h 上声明 block 变量,然后在 .m 上使用它们。我尝试这样做,但收到错误。
- 我在 block 的第一行设置了一个调试点,但它并没有停止在那里;
- block 内的 NSlog 行不打印任何内容。该 block 没有被调用吗?
你们能帮我解决这个问题吗?
最佳答案
您误解了 block 的工作原理。 (好吧,这很明显。)就像 previousString
一样。是一个指向 NSString 的变量,differentStrings
是一个指向 block 的变量。不是运行 block 的结果,而是 block 本身。也就是说,执行此操作后:
__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;
}
};
differentStrings
是一个指向 block 的变量。因此,当您执行此操作时:
if (differentStrings)
...您只需检查是否 differentStrings
包含 0 或 NULL 以外的内容。由于它包含一个 block ,因此它不为空,因此计算结果为 true。
记住:differentStrings
是 block 变量,而不是 BOOL 变量。它包含一个 block (一个函数,如果你愿意的话),当调用时将返回一个 bool 值。因此,为了实际运行该 block ,您需要调用它。像这样:
differentStrings();
或者,根据您的情况:
if (differentStrings()) {
NSLog (@"strings are different");
}
编辑:正如评论中指出的,自 differentStrings
是一个实例变量,你需要copy
它,就像您打电话 retain
一样在分配给实例变量的任何其他对象上。 (出于技术原因,我现在不会讨论,您应该始终将 copy
与 block 一起使用,而不是 retain
。)同样,您需要调用 release
。稍后某个时候,也许在您的 dealloc
中方法。
关于iphone - 尝试了解 iOS 上的 block ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4614908/