2011-11-15 149 views
1

在我的節目,我有什麼時候需要分配類?

NSString *stringOne = [NSString stringWithFormat:@"Hello World"]; 
[variable insertText:stringOne]; 

和代碼運行正常。我知道'stringWithFormat:'方法啓動對象,但是alloc在哪裏發生?爲什麼這裏不需要?

我可以做同樣的NSSound

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"]; 
[favoriteSong play]; 

這將運行了。我知道'soundNamed:'返回&啓動對象,但NSSound從未分配。

我一直認爲我會做下列..

NSSound *favoriteSong = [[NSSound alloc]initWithBlablanla]; 

,然後從那裏繼續以一切工作。

我在問什麼,分配發生在哪裏?

+0

系統負責分配'classes' - 你很少需要擔心這一點。然而,'實例'完全是另一回事。 –

回答

1

一些方法,如soundNamed分配一個自動釋放對象並返回它。作爲一個例子,讓我們想象的2種方法存在:

電話:

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"]; 

回報NSSound分配的對象,用@ inited 「星期五」。這個返回的對象是autoreleased。

電話:

NSSound *favoriteSong = [[NSSound alloc] initWithSoundNamed:@"Friday"]; 

回報NSSound分配的對象,用@ inited 「星期五」。這個返回的對象被保留,並且必須被解除分配。

這兩個呼叫會做同樣的事情:

NSSound *favoriteSong = [NSSound soundNamed:@"Friday"]; 
NSSound *favoriteSong = [[[NSSound alloc] initWithSoundNamed:@"Friday"] autorelease]; 

作爲快捷方式,soundNamed是一樣的東西:

+ (id) soundNamed:(NSString*)name 
{ 
    NSSound* aSound = [[NSSound alloc] initWithSoundNamed:name]; 
    if (!aSound) return nil; 

    return [aSound autorelease]; 
} 
+0

非常感謝你。你的回答是最好的。非常感謝兄弟。謝謝.. – user1048633

+0

哦,謝謝大家的回覆,我現在明白了。 – user1048633

0

何時需要分配類?

你不應該打擾類對象太多,它都是自動完成的。我真的認爲我們不是在談論同樣的事情。也許你的意思是「類方法返回的對象」而不是「類」。例如:

何時對象返回的類方法需要分配嗎?

看起來更合適。

該分配發生在哪裏?

您在這些詞語前面回答了這個問題。它發生在+stringWithFormat:方法中。

爲什麼這裏不需要?

它不需要在你身邊,因爲它已經在圖書館方面完成了。

我知道'soundNamed:'返回&啓動對象,但NSSound從未分配。

當然是了。如果存在,則分配*。同樣,它被分配在+soundNamed:方法中。


*至少在正常的手段。也許有人可以引用一個角落案例。

+0

非常感謝你 – user1048633

1

stringWithFormat聲明爲connivence類方法:

+ (id)stringWithFormat:(NSString *)format, ... 

請注意字體中的「+」,表示類方法。文檔狀態:

返回通過使用給定的格式字符串作爲模板創建的字符串,其餘參數值被替換爲模板。

但是,即使這是沒有必要的,一個可以很準確地寫出:

[variable insertText:@"Hello World"]; 

它很可能是值得的Objective-C的讀Apple's documentation

+0

'[變量insertText:@「Hello World」]'也許... – sidyll

+1

修正了錯字,謝謝@sidyll! – zaph

0

這些方法被稱爲便利(類)方法,它返回一個自動釋放對象。換句話說,在某個地方爲stringWithFormat實施類似於

NSString * string = [[[NSString alloc] init] autorelease]; 
0

基本上stringWithFormat東西分配對象,它把一個autorelese池並返回給你。你可以找到NSString的GNUStep實現here

相關問題