iphone - 尝试了解 iOS 上的 block

标签 iphone objective-c-blocks

我正在尝试了解如何在 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);

这些是我遇到的问题:

  1. 该 block 始终返回 YES(字符串不同)
  2. 我不愿意在 videoDidLoad 中声明这一点。我应该如何声明它,以便我可以在全局范围内使用它作为方法?我应该像使用方法一样来表达它吗?
  3. 我正在 block 内调用方法“getString”。可以吗?
  4. 我觉得在 .m 上声明 block 变量很奇怪。正如我所见,我应该在 .h 上声明 block 变量,然后在 .m 上使用它们。我尝试这样做,但收到错误。
  5. 我在 block 的第一行设置了一个调试点,但它并没有停止在那里;
  6. 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/

相关文章:

ios - UIView按预期用animateWithDuration对setBackgroundColor进行动画处理。但是,UILabel立即发生。为什么?

objective-c - Blocks 的奇怪内存泄漏和在 ARC 中以某种方式复制

iphone - 如何获取 UIFont 实例的字体大小或粗体版本

ios - 如果我稍后使用 SKTextureAtlas,Sprite Kit 是否会多次加载纹理图集?

iphone - 从 UITableView 中删除部分

ios - 如何使方法具有可执行 block 作为参数,该参数应在 objective-c 中的方法完成时执行

objective-c - 使用完成 block 创建自定义方法

ios - 为什么将UIViewController释放在主线程上?

ios - 对于我的 iOS 笔记应用程序来说,这是包含文本、照片、音频和绘图笔记的最佳 iCloud 方法。我应该选择文档存储还是CloudKit?

iphone - 停止网络事件指示器