2010-11-19 111 views
0

我很好奇,如果我在這裏使用的代碼是這樣做的好方法。基本上我是通過從我的ViewController中實例化來創建一個簡單的模型對象(在MVC中)。這個想法是,我第一次打電話[[self dataModel] doSomething];它創建一個新的(或重新使用一個現有的)對象。我特別關心設置屬性和正確釋放本地分配,任何意見將不勝感激。分配/保留模型(mvc)?

// INTERFACE 
DataModel *dataModel; 
@property(nonatomic, retain) DataModel *dataModel; 

// IMPLEMENTATION 
@synthesize dataModel; 

// Lazy Instanciation ... 
- (DataModel *)model { 
    if(!dataModel) { 
     DataModel *tempDataModel = [[DataModel alloc] init]; 
     [self setDataModel:tempDataModel; 
     [tempDataModel release]; 
    } 
    return dataModel; 
} 

// Clean up 
- (void)dealloc { 
[dataModel release]; 
[super dealloc]; 
} 

OR:(雖然我真的不喜歡這個,因爲它看起來混亂我)

// Lazy Instanciation ... 
- (DataModel *)model { 
    if(!dataModel) { 
     [self setDataModel:[[DataModel alloc] init]]; 
     [dataModel release]; 
    } 
    return dataModel; 
} 

加里。

回答

1

第一個更好,並且相當標準和正確。第二種形式是一般的不良形式。因爲你完全不清楚你的對象init是否與release相同。總是最好這樣想:

instiate object 
do something with object 
release object 

在這種情況下,「用對象做某事」恰好將它分配給不同的實例變量。但是,你在那裏做什麼並不重要,這種模式是成立的。這完全取決於setDataModel:方法之後對象發生了什麼。

個人而言,對於大多數情況下,我更喜歡autorelease。只是因爲你不得不考慮更少。

DataModel *tempDataModel = [[[DataModel alloc] init] autorelease]; 
[self setDataModel:tempDataModel]; 

所以更容易模式要記住的是:

instantiate and autorelease object 
do something with object 

但是,這是一個風格問題,和許多人寧願明確release

+0

嗨,如果可能的話我一直在努力(作爲一個經驗法則),以避免使用自動釋放。但我可以看到你的觀點,它確實使這個方法變得簡單多了,再加上只會有一個,所以任何開銷都是最小的。非常感激。 – fuzzygoat 2010-11-19 18:41:28

+1

'release'比'autorelease'更好,因爲它更有可能更快地釋放內存。但根據我的經驗,'autorelease'可以減少錯誤,並且可以防止很多超級用戶很難調試與內存管理問題相關的痛苦。這是因爲你可以在同一個地方平衡init和release權限,並且很容易判斷它是否不平衡。只要你的對象不是龐大的數據包,'autorelease'不會引起太多的開銷。 – 2010-11-19 18:47:48

1

第一種方法更清晰,但效果相同。但是,請注意,如果製作dataModel屬性並使用訪問器的retain機制的想法是將所有內容都保存在一個地方,那麼直接使用伊娃將破壞封裝。

實際上,這個model方法和dataModel屬性之間似乎有點混淆。這將是更好重組的事情,使一切都在dataModel訪問本身,避免這種略顯尷尬重定向:

- (DataModel*) dataModel 
{ 
    if (! dataModel) 
    { 
     // direct ivar access is legit inside the accessor itself 
     // (at least, I would say so -- no doubt others will disagree!) 
     dataModel = [[DataModel alloc] init]; 
    } 

    return dataModel; 
} 
1

你可能會考慮重寫數據模型合成的吸氣劑。否則,它可能與dataModel getter和model消息有點混淆。

我認爲你可以重寫你的合成吸氣這樣的:

- (DataModel *)dataModel { 
    if(!dataModel) { 
     dataModel = [[DataModel alloc] init]; 
    } 
    return dataModel; 
}