在Objective C中使用指针的最大优势是什么?

时间:2013-02-20 23:04:34

标签: objective-c c cocoa pointers

我意识到99%的人认为“这是什么......”但请帮助我理解使用pointers的概念。我相信我的具体问题会对很多新手有所帮助。

我理解指针是什么,并且它们是对内存中地址的引用,并且通过使用(*)运算符,您可以获取该地址中的值。

让我们说:

int counter = 10;
int *somePointer = &counter;

现在我的内存地址为counter,我可以通过这样做间接指出它的价值:

int x = *somePointer;

哪个会x = 10,对吧?

但这是最基本的例子,对于这种情况,我可以使用int x = counter;并获得该值,所以请解释为什么指针在Objective-C和其他一些语言中确实如此重要......在什么情况下只有指针才有意义?

欣赏它。

4 个答案:

答案 0 :(得分:5)

Objective-C有指针,因为它是C的演变,它广泛使用指针。像Objective-C这样的面向对象语言中的指针的优点是,在创建对象之后,您可以传递指向对象的指针,而不是绕过对象本身。换句话说,如果你有一些占用大量存储空间的对象,那么传递指针比传递对象本身的副本要高得多。当你只处理像int这样的原始类型时,这可能不是很明显,但是当你开始处理更复杂的对象时,内存和时间的节省是巨大的。

更重要的是,指针使得 更容易让代码的不同部分相互通信。如果变量只能通过“按值”而不是“通过引用”(这是使用指针时会发生的情况)传递给函数,那么函数永远不会改变它们的输入。它们只能通过返回值或更改全局变量来改变程序的状态 - 过度使用通常会导致草率,无组织的代码。

这是一个具体的例子。假设您有一个Objective-C方法,它将解析JSON字符串并返回NSDictionary

+ (NSDictionary *)parseJsonString:(NSString *)json
                            error:(NSError **)error;

如果一切正常,该方法将进行解析并返回NSDictionary。但是如果输入字符串有问题怎么办?我们想要一种方法向用户(或至少向程序员)指示发生了什么,因此我们有一个指向NSError指针的指针,该指针将包含该信息。如果我们的方法失败(可能返回nil),我们可以取消引用error参数以查看出错的地方。我们实际做的是为我们的方法提供两种不同类型的返回值:通常,它会返回NSDictionary,但它也可以返回NSError

如果你想了解更多关于这一点,你可能会更好地搜索“C中的指针”而不是“Objective-C中的指针”;指针当然在Objective-C中广泛使用,但所有底层机制都与C本身相同。

答案 1 :(得分:2)

  

在ObjectiveC中使用指针的最大优势是什么

我说最大的优点是你可以使用Objective-C - 所有Objective-C对象都是指针是用指针访问的(编译器和运行时不会让你静态创建对象),所以没有它们你就不会再进一步​​了......

答案 2 :(得分:1)

<强>档案:

如果我告诉你给我写一个维护一组计数器的程序怎么办,但用户在启动程序时会输入计数器的数量。我们使用在堆上分配的整数数组对此进行编码。

int *counters = malloc(numOfCounters * sizeof(int));

Malloc直接使用内存,因此它本质上会返回一个指针。所有Objective-C对象都使用malloc进行堆分配,因此这些对象始终是指针。

<强>档案:

如果我告诉你给我写一个读取文件的函数,然后在完成后运行另一个函数怎么办?然而,这个其他功能是未知的,并且会被其他人添加,我甚至都不知道。

为此我们有“回调”。你会写一个看起来像这样的函数:

int ReadAndCallBack(FILE *fileToRead, int numBytes, int whence, void(*callback)(char *));

最后一个参数是指向函数的指针。当有人调用您编写的函数时,他们会执行以下操作:

void MyDataFunction(char *dataToProcess);

ReadAndCallBack(myFile, 1024, 0, MyDataFunction);

<强>档案:

将指针作为函数参数传递是从函数返回多个值的最常用方法。在OSX上的Carbon库中,几乎所有库函数都返回错误状态,如果库函数必须向程序员返回一些有用的东西,则会出现问题。所以你把你希望函数的地址传递回给你......

int size = 0;
int error = GetFileSize(afilePath,&size);

如果函数调用返回错误,则它位于error,如果没有错误,error可能为零,size将包含我们需要的内容。

答案 3 :(得分:-1)

Objective-C或任何动态分配语言中指针的最大优点是,您的程序可以处理的项目多于您在源代码中创建的名称。