当前位置: 首页 > 知识库问答 >
问题:

如何判断Objective-C中的块参数是否正在转义?

郏志诚
2023-03-14

很长一段时间Swift dev在这里,但已经有十年没有接触Objective-C了,所以肯定是生锈了。试图弄清楚如何判断一个块参数是否转义(也就是说,这样我就知道是否使用弱引用,因为非转义块不需要它。)

例如,根据我所读到的,在Objective-C中,默认情况下,块参数是隐式转义的(这与Swift BTW相反。)如果你不希望这样,你必须使用NS_NOESCAPE注释,就像这样...

- (void)executeActions:(void (NS_NOESCAPE ^)(void))actions;

然而,我被告知的enumerateObjectsUsingBlock函数是不可转义的,但我在Apple的留档中没有看到对该方法的注释。实际上,他们根本没有谈论转义或非转义。他们只是列出了方法。

同样,这是文档。

然后我尝试搜索头文件。我遇到了NSArray。h确实提到了它,但在那里我也没有看到NS_NOESCAPE

https://github.com/.../NSArray.h(第79行)

(我认为这可能是一个生成/抓取的页面,所以也许在这里找不到该信息,你需要原始标题。不确定。再次,生锈。

那么如何确定方法的块参数是否正在转义呢?

共有2个答案

白高超
2023-03-14

我认为这已经无关紧要了……下面的代码编译和运行都没有问题,无论我如何尝试用NS_NOESCAPE打破它。你把它放在哪里并不重要。。。

- (NSOperationQueue *)queue
{
    if ( ! _queue )
    {
        _queue = [[NSOperationQueue alloc] init];
    }

    return _queue;
}

- ( void ) t1:( NS_NOESCAPE void(^)(NSString *) ) b
{
    [self.queue addOperationWithBlock:^{
        b(@"a");
    }];
    [self t2:b];
}

- ( void ) t2:( void(^)(NSString *) ) NS_NOESCAPE b
{
    [self.queue addOperationWithBlock:^{
        b(@"b");
    }];
    [self t3:b];
}

- ( void ) t3:( void(NS_NOESCAPE ^)(NSString *) ) b
{
    [self.queue addOperationWithBlock:^{
        b(@"c");
    }];
    [self escape:b];
}

- ( void ) t4:( void(^)(void) ) NS_NOESCAPE b
{
    [self.queue addOperationWithBlock:b];
}

- ( void ) escape:( void (^)( NSString * ) ) b
{
    b ( @"away" );
    [self.queue waitUntilAllOperationsAreFinished];
}

(我希望在以前版本的编译器上测试这一点,但是手头没有。)

吕天逸
2023-03-14

enumerateObjectsUsingBlock:的留档说

此方法同步执行。

添加< code>NS_NOESCAPE时,文档未更新。

 类似资料:
  • 本文向大家介绍C++中判断成员函数是否重写,包括了C++中判断成员函数是否重写的使用技巧和注意事项,需要的朋友参考一下 C++中判断成员函数是否重写 判断一个成员函数是不是虚函数(重写),有两个三个条件: 两个成员函数各自在基类和派生类中定义; 基类中定义的成员函数必须带有关键字virtual,派生类的成员函数可带可不带。 这两个成员函数原型(函数名,函数参数,函数返回类型)必须相同。 注意:如果

  • 函数名称:获取设备充电状态 函数功能: 用于判断当前设备充电状态 函数方法 charging = device.betteryCharging() 返回值 类型 说明 charging boolean true - 充电中,false - 未充电 函数用例 charging = device.betteryCharging() if charging then dialog("充电中

  • 当我使用Mybatis时,DAO接口指定传递的参数名为“param”,这是一个POJO,内部有两个属性。现在我需要基于这两个属性的存在进行不同的查询。我不知道该怎么做。

  • 问题内容: 我有这段代码,用于检查从我的应用程序中许多地方调用的Activity的Intent中是否有多余的值: 如果未设置isNewItem,我的代码会崩溃吗?在我调用它之前,有什么方法可以告诉它是否已设置吗? 处理此问题的正确方法是什么? 问题答案: 正如其他人所说,两者和都可能返回null。因此,您不想将调用链接在一起,否则您可能最终会调用,这将引发并导致应用程序崩溃。 这就是我要完成的方法

  • 问题内容: 在Linux中使用屏幕时,如何确定我是否在屏幕中?如果可以,我可以退出屏幕,但是如果没有,那么我将关闭终端。 在执行操作时,我可以查看是否还连接了其他屏幕,但是如何知道我的当前终端是否是这些已连接屏幕之一? 问题答案: 检查。如果为空,则您位于“真实”终端上。如果包含任何内容,则为您所在屏幕的名称。 如果您不在屏幕上: 如果您在屏幕上:

  • 如何判断sqlite3数据库中是否存在值,python 以下是我目前的代码: 如果数据库中没有电子邮件和用户名,我希望它只将值插入数据库,但我不知道从哪里开始。