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

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

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

让我们说:

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

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

 int x = *somePointer; 

这使x = 10 ,对吧?

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

欣赏它。

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本身相同。

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

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

项目:

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

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

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

项目:

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

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

 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将包含我们需要的内容。

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