2010-10-16 83 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對象的原因。