基本Objective-C指针问题

时间:2010-10-16 23:46:18

标签: objective-c pointers

#import <Foundation/Foundation.h>

BOOL areIntsDifferent( int thing1, int thing2 ) {
    if (thing1 == thing2) {
        return (NO);
    } else {
        return (YES);
    }
}

NSString *boolString (BOOL yesNo) {
    if (yesNo == NO) {
        return( @"NO" );
    } else {
        return( @"YES" );
    }
}

int main (int argc, const char * argv[]) {
    BOOL areTheyDifferent;

    areTheyDifferent = areIntsDifferent (5,5);

    NSLog(@"are %d and %d different? %@", 5, 5, boolString(areTheyDifferent));

    areTheyDifferent = areIntsDifferent (23,42);

    NSLog(@"are %d and %d different? %@", 23, 42, boolString(areTheyDifferent));

    return (0);
}

这是整个计划。它并不是非常复杂,但它解释了我一直遇到的一个常见问题 - 理解指针。在这种情况下,boolString函数的返回值是否为指针,因为没有分配内存来保存字符串?如果是这样,为什么areIntsDifferent返回值不是指向BOOL值的指针?我可以重写这个程序,以便boolString的返回值是一个字符串而不是指向字符串的指针吗?如果是这样,怎么样?我试图消除*但是后来我遇到编译器错误。

2 个答案:

答案 0 :(得分:4)

NSString是一个对象。在Obj-C中,对象总是被指针传递,而不是通过复制它们的实际内存。

BOOL是原始的。与对象不同,基元通过值传递。

这种二分法的部分原因是原语很小但是对象可能非常大(如UIImage),因此按值传递对象会浪费大量内存。另一个原因是通过指针传递对象允许集合保存不同类型的混合对象。例如。 NSArray可以在NSString和NSNumber旁边保存UIImage。 Apple很容易实现,因为所有指针都与内存中的字节数相同。如果对象是通过值而不是指针处理的,那么集合中的混合类型将非常困难,因为您将拥有不同大小的项目而不是统一大小的指针。

答案 1 :(得分:2)

在处理Objective-C对象的实例时,您将只处理引用该实例的指针。

鉴于这一事实......

  

boolString函数的返回值是否为指针,因为没有分配内存来保存字符串?

对于boolString函数,文字@"YES"@"NO"实际上会生成对象实例,这些对象可以作为指向NSString对象的指针返回。鉴于以上关于仅通过指针可用的实例的注释,它返回NSString*,因为这是@"YES"@"NO"的唯一方式,并且是它返回字符串的唯一方式。 / p>

  

为什么areIntsDifferent返回值不是指向BOOL值的指针?

BOOL是一个值类型,因此可以直接从方法/函数返回并直接作为参数传递。

  

我可以重写这个程序,以便boolString的返回值是一个字符串而不是指向字符串的指针吗?

不,由于已经陈述的关于Objective-C对象的原因。