#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的返回值是一个字符串而不是指向字符串的指针吗?如果是这样,怎么样?我试图消除*但是后来我遇到编译器错误。
答案 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对象的原因。