2011-11-14 55 views
1

我有一個簡單的程序播放一首歌曲。它在繼承的awakeFromNib方法中。所以..NSSound工作,但沒有初始化或分配..

-(void)awakeFromNib { 
NSSound *song = [NSSound soundNamed:@"MyTune.mp3"]; 
[song play]; 
} 

我的問題是,爲什麼這個工作。爲什麼我沒有做到這一點

NSSound *song = [[NSSound alloc]init]; 
song = [NSSound soundNamed:@"MyTune.mp3"]; 
[song play]; 
} 

它也似乎與字符串工作太..我有一個NSTextView變量設置,我可以做以下

-(void)awakeFromNib { 
NSString *str = [NSString stringWithFormat:@"Hello there!"]; 
[myTextVariable insertText:str]; 
} 

爲什麼沒」我不得不分配和初始化對象..我很失落。 請幫忙。

+0

有人嗎?我只是很難理解這一點。 – Heartbound07

回答

1

許多蘋果的類都有助手函數,它們在助手函數中,在類級聲明,它爲你做了alloc和init。他們返回一個準備使用的對象。你可以知道yu是否看到了該方法的doc,並且它說的是「返回與給定名稱關聯的NSSound實例」。因此

你的第一個例子是好的代碼:

-(void)awakeFromNib { 
NSSound *song = [NSSound soundNamed:@"MyTune.mp3"]; 
[song play]; 
} 

你的第二個例子發生內存泄漏,因爲你的alloc,然後通過[NSSound soundNamed:@"MyTune.mp3"]返回一個新的對象覆蓋指針:

-(void)awakeFromNib { 

    // Create an NSSound object in memory and store the address in song. 
    NSSound *song = [[NSSound alloc]init]; 

    // If you don't want a memory leak this is your last chance to [song release] 

    // Create a NSSound object using a helper function and place its address 
    // in song, over writing the previous address. 
    song = [NSSound soundNamed:@"MyTune.mp3"]; 

    // We now lost track of the first NSSound object and can't release it because 
    // we overwrote the address. 

    [song play]; 
    } 

the documentation你可以看到此方法正在執行其中的allocinit並將實例返回給您:

soundNamed

返回與給定名稱關聯的NSSound實例。

+(ID)soundNamed:(的NSString *)soundName

參數

soundName 名稱標識的聲音數據。

返回值

NSSound例如由soundName標識的聲音數據初始化。

+0

好的,所以說我的第二個例子,我包括 [歌曲發佈]; 它會是一回事嗎? – Heartbound07

+0

由於您沒有分配它,因此您不會釋放它。當你使用助手功能時,Apple的代碼將控制你的釋放。它這樣做是因爲它*分配它。 –

+0

我想我沒有明白你的意思。如果您在第二個示例中的第2行和第3行之間插入發佈請求,那麼是的。它在功能上與第一個例子相同,但浪費CPU週期和編碼。 –