【问题标题】:What is the biggest advantage of using pointers in ObjectiveC在 Objective C 中使用指针的最大优势是什么
【发布时间】:2013-02-20 23:04:33
【问题描述】:

我知道你们中有 99% 的人认为“这是什么鬼……”但是请帮助我理解使用 pointers 的概念。我相信我的具体问题会帮助很多新手。

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

假设:

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

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

int x = *somePointer;

x = 10,对吧?

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

欣赏它。

【问题讨论】:

  • 指针不是对地址的引用。您可能会说指针是对内存的引用,或者它是对变量的引用,但它一个地址。 (从技术上讲,指针是一个变量,它的值是一个地址。英文是模棱两可的。)
  • 不能简单地静态分配对象。
  • @CodaFi 你搞定了。
  • @NickCave - 当然,在任何形式意义上,指针早在“对象”之前就已经存在了。但是指针对于最终产生对象的术语来说是必要的,有点像零的发明如何彻底改变数学。 (尽管发明指针并没有花那么长时间。它们在第一天就没有了,但到了大约第三天。)

标签: objective-c c cocoa pointers


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 底层机制不仅与 C 本身完全相同,它 C
  • @CodaFi 今晚你一如既往的精彩:D
【解决方案2】:

在ObjectiveC中使用指针最大的好处是什么

我想说最大的优点是你可以使用 Objective-C - 所有的 Objective-C 对象是指针都是使用指针访问的(编译器和运行时不会让你静态创建对象),所以如果没有它们,您将不会有任何进展...

【讨论】:

    【解决方案3】:

    项目:

    如果我告诉你写一个程序来维护一组计数器,但计数器的数量将由用户在启动程序时输入。我们用分配在堆上的整数数组来编码。

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

    【讨论】:

    • 如果我告诉你这个答案没有一点点在 ObjC 中怎么办? (当然,节省堆分配)
    • 我承认在使用 Objective-C 的头几个月我从来没有真正理解过指针,我必须学习纯 C 才能真正理解这个概念。
    【解决方案4】:

    在 Objective-C 或任何具有动态分配的语言中,指针的最大优势在于,您的程序可以处理比您在源代码中发明的名称更多的项目。

    【讨论】:

    • 对不起,但这没有多大意义。指针如何影响变量名?你知道如何将指针与数组混淆吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多