2010-10-16 80 views
3
#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函数的返回值是一个指针,因为没有分配内存来存放一个字符串?如果是这样,为什么不是areInts不同的返回值指向BOOL值的指针?我可以重写这个程序,以便boolString的返回值是一个字符串,而不是一个指向字符串的指针吗?如果是这样,如何?我试图消除*,但然后我得到一个编译器错误。基本Objective-C指针问题

+0

http://stackoverflow.com/questions/3951484/basic-objective-c-pointer-question重复? – 2010-10-17 01:01:49

+0

@Joe另外一个人得到了最近的投票,但感谢你指出了它。 :) – 2010-10-17 01:20:02

回答

4

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

BOOL是一个原语。与对象不同,基元是按值传递的。

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

+0

谢谢,这真的解释得很好。对不起,双重发布 - 我认为第一个没有出于某种原因。 – startuprob 2010-10-17 02:38:02

2

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

根据这一事实光...

是对boolString的返回值函数指针因为没有内存分配给持有字符串?

在你boolString功能的情况下,文字@"YES"@"NO"实际上导致可返回指针NSString对象对象的实例。鉴于上述有关只能通过指针使用的实例的评论,它将返回NSString*,因为这是@"YES"@"NO"是的,并且它是唯一可以返回字符串的方法。

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

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

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

不,因为已经提到的有关Objective-C对象的原因。