0

我正在学习目标 C。

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

我知道*是指指向内存对吗?

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

但是今天我遇到了这个^符号。谁能帮忙解释一下好吗?

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

3 回答 3

4

*用于普通的旧 c 指针。 ^用于块(proc、闭包、lambda)。具体来说,Objective-C 中的块被实现为闭包。

^本质上是一个函数指针,具有一些与作用域相关的副作用,可以区分复制必要的对象和原语,以便在调用块(函数)时,块中的变量是外部作用域中的变量的副本,其中该块已定义。

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

可以在 Apple 的文档中找到 BIG 全面内容。

编辑:

在你的具体例子中......

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

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

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

于 2013-04-04T02:33:45.750 回答
3

^与Objective-C中的块有关。看看文档

于 2013-04-04T02:32:56.787 回答
2

*用于指针和乘法。

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

test是一个指向NSString.


^(id obj1, id

^用于创建。_


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

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

 void (*func)(void); 

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

 void (^block)(void); 
于 2013-04-04T02:32:05.393 回答