目标C *和^之间的差异

时间:2013-04-04 02:28:28

标签: objective-c

我正在学习目标C.

只是想知道*^之间的区别。

我知道*意味着记忆正确吗?

NSString *test = [[NSString alloc] init];

但今天我遇到了^符号。有人可以帮忙解释一下吗?

-(void) sort
{
    [book sortUsingComparator:
    ^(id obj1, id obj2) {
        return [obj1 compareNames: obj2];
    } ];
}

3 个答案:

答案 0 :(得分:4)

*用于普通的旧c指针。 ^用于块(proc,closure,lambda)。具体来说,Objective-C中的一个块实现为Closure。

^本质上是一个函数指针,带有一些与范围相关的副作用,它们区别地复制必要的对象和基元,这样当调用块(函数)时,块中的变量就是一个副本。属于定义块的外部范围的那些。

在Objective-C中,块是一个非常大且有些复杂的主题。您可以找到非常简洁的概述here

Apple的文档中可以找到BIG综合内容here

编辑:

在您的具体示例中......

-(void) sort
{
    [book sortUsingComparator:
    ^(id obj1, id obj2) {
        return [obj1 compareNames: obj2];
    } ];
}

方法sortUsingComparator:将匿名块作为参数。简化的块签名是^(id obj1, id obj)。简化的含义是,由于返回类型为void,因此可以省略。是什么让这个例子让很多人感到困惑的是,这个块实际上是在一个方法调用的中间内联定义的。

如果块首先使用描述性名称声明,然后像任何其他c函数一样定义,然后在方法调用中使用 name ,则此代码将更容易阅读。但是,似乎大多数开发人员都不这样做。

答案 1 :(得分:3)

^与Objective-C中的块有关。看看the documentation

答案 2 :(得分:2)

*用于指针和乘法。

NSString *test = [[NSString alloc] init];

此处test是指向NSString的指针。


^(id obj1, id

^用于createblock


如果您熟悉C / C ++,那么:

这是C函数指针声明......

 void (*func)(void); 

这是一个块声明......

 void (^block)(void);