2013-10-05 126 views
0

之間有什麼區別:當然是第二個不工作指針語法*對象VS對象

NewClass *object = [NewClass new]; 
printf("%s", [object stringValue]); 

NewClass *object = [NewClass new]; 
printf("%s", [*object stringValue]); 

。但爲什麼?當你確切地使用*而不是?

+2

簡短的回答是'objc_msgSend'需要一個對象指針。 –

+1

對於上帝的愛,不要像這樣取消引用Objective-C對象。它曾經在32位和64位舊運行時間下工作,但isa在這一點上只是一點點湯。 – CodaFi

+0

也使用'NSLog(@「%@」,object)'來打印對象。 –

回答

0

接受的答案是誤導性的,所以即使它是一個重複的問題,我只是在這裏提供一個解釋。

首先,你只使用*object來聲明和從不使用。 Objective-C中的指針只是指針,所以你可以相應地使用它們。

作爲一個例子,這裏的可可,其中通過引用傳遞(指針)的NSError實例的典型模式:

NSError *error = nil; 
BOOL success = [self methodThatMayFailWithError:&error]; 
if (!success) { 
    NSLog(@"%@", error.localizedDescription); 
    //handle error 
} 

其中-methodThatMayFailWithError:被聲明爲

- (BOOL)methodThatMayFailWithError:(NSError **)error { 
    if (somethingVeryBadHappened) { 
     *error = [NSError errorWithDomain:@"myAppDomain" code:42 userInfo:@{NSLocalizedDescriptionKey : @"You screwed up!"}]; 
     return NO; 
    } 
    return YES; 
} 

,你可以請參見執行取消NSError **指針以獲得NSError *

所以指針是指針。期。

也就是說,在Objective-C指針中使用得非常無縫。這是因爲Objective-C運行時是爲了操作指向對象的指針而構建的。考慮下面這個例子:

NSString *aString = @"Hello"; 
NSUInteger stringLength = [aString length]; 

[aString length]會 - 或多或少 - 導致以下運行時代碼

objc_msgSend(aString, @selector(length)); 

現在,如果你看一看的objc_msgSend

id objc_msgSend(id theReceiver, SEL theSelector, ...) 

你簽名會注意到它需要一個類型爲id的參數,這意味着一個指向對象的指針。

該示例說明了整個Objective-C消息傳遞系統是如何設計使用指針的,這就是爲什麼聲明指針並且在使用它們之前不要對其進行解引用的原因。

這也會導致某種術語object的誤用。

NSString *aString; 

我們通常說aStringNSString,而它實際上是一個指針NSString。這似乎令人困惑,但語言的設計使其非常透明,因此它已成爲通用術語的一部分。