2011-06-14 31 views
0

什麼是這兩種方法之間的主要區別:Objective-C的對象創建方法的差異

+ (id)videoGameWithTitle:(NSString *)newTitle publisher:(NSString *)newPublisher year:(int)newYear { 
    VideoGame *game = [[[VideoGame alloc] init] autorelease]; 
    game.title = newTitle; 
    game.publisher = newPublisher; 
    game.year = newYear; 

    return game; 
} 

- (id)initVideoGameWithTitle:(NSString *)newTitle publisher:(NSString *)newPublisher year:(int)newYear { 

    self = [super init]; 

    if(self) { 
     self.title = newTitle; 
     self.publisher = newPublisher; 
     self.year = newYear; 
    } 
    return self; 
} 
+3

第一種方法不是初始化:它是[便利構造函數](http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocAllocInit.html)。第二種方法是嘗試成爲一個初始化程序,但由於它是一個試圖表現爲實例方法的類方法,因此失敗了。作爲一個方面說明,第二種方法不遵循Cocoa的命名初始化程序的規則,如'init ...' – 2011-06-14 10:22:32

+0

@Bavarious - +1爲您的評論。我已經修復了這個問題中的拼寫錯誤,因爲我懷疑@Peter希望第二種方法實際上是一個正確命名的初始化方法。 (方法體當然看起來像他想的那樣。) – 2011-06-14 11:02:00

+0

@sherm Pendley - 回滾您的編輯。你已經完全改變了這個問題 - 你認爲OP確實犯了很多錯別字 - 使它成爲一個不同的問題。 – Abizern 2011-06-14 11:55:00

回答

1

第一種方法是創建一個對象調用者不擁有,不得釋放的一類方法。第二個(除了原始問題中的拼寫錯誤)是一個初始化程序,並且由於調用方必須與+alloc結合調用它,它會返回調用方擁有且必須釋放的對象。

有關完整的說明,包括描述哪些方法名稱暗示所有權和哪些不顯示,請查看Apple的Memory Management Programming Guide