2012-09-03 26 views
0

我想知道你將如何釋放一個單身釋放單身

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth; 
{ 
    // Not autoreleased, as it is basically a singleton: 
    return [[self alloc] initForView:addToView withLabel:labelText width:labelWidth]; 
} 

在分析此使用分析工具,我得到以下錯誤:對象在線90 潛在的泄漏這是一個返回行。

我已經嘗試autorelease解決了錯誤消息的問題,但我不相信它正確的解決方案,因爲我讀了autoreleasing單身並不好。有人能夠幫助我確定如何最好地釋放這個對象嗎?

感謝

+1

我不知道你在哪裏使用一個單身... – Martin

回答

2

之所以儀給你的警告,基本上方法名稱:

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth; 
根據Objective-C的約定

,所有的方法名以「創造」 /」新「/ ...返回一個保留的對象;你的方法屬於便利構造函數的類別,這些構造函數有望返回自動釋放對象,因此是警告。

另一方面,你說這是一個單身人士,但事實上並非如此。所以,你最終可能會不止一次地調用這個方法,從而產生實際的泄漏。一個基本的方法,使您更安全的方法(多單類)是:

+ (DSActivityView *)activityViewForView:(UIView *)addToView withLabel:(NSString *)labelText width:(NSUInteger)labelWidth; 
{ 
    static DSActivityView* gDSActivityViewSingleton = nil; 
    if (!gDSActivityViewSingleton) 
      gDSActivityViewSingleton = [[self alloc] initForView:addToView withLabel:labelText width:labelWidth]; 
    return gDSActivityViewSingleton; 
} 

這樣既能使分析器放鬆,給你的方法的誤用的可能性更前面的安全。

1

使用autorelease。沒有理由不這樣做。基本上,對象的所有權屬於對象,所以你永遠不能手動釋放它。作爲一個單例,不要緊,如果你不擁有它,因爲大概下次你調用它並需要它在範圍內時,你會使用另一個便捷方法,它會被再次實例化。

如果你想擁有對象的所有權,那麼你將需要實例化它作爲正常,然後你將能夠保留和釋放它。

另外,閱讀塞爾吉奧的編輯關於它不是一個「適當的」單身人士。 :p

此外,如果可以的話,轉換爲ARC,您不必擔心這一點!

+0

不幸的是,項目需要工作在4以上的舊設備,所以我不能使用ARC :( – CodeGeek123

+0

弧是支持iOS 4及以上版本:) http://stackoverflow.com/questions/7747783/is-arc-really-supported-in-ios-4-the-ios-4-2-sdk-is-missing-arc-相關符號 - 基本上就是不使用'weak'引用。 –

1

你做錯了。考慮:

如果您多次調用activityViewForView,您將無法一次又一次地獲取同一個對象。它只會初始化一個新的對象,並給你指針!

爲了使這個東西成爲一個單例,你必須將創建的對象存儲在一個常量變量中,並確保在應用程序運行的時候你有一個對象引用(例如,聲明指向這個對象的指針的appDelegate)。

然後每次你打電話activityViewForView你必須檢查常量變量,如果它指向一個有效的對象。如果是這樣,返回有效對象,如果沒有,創建它並將其存儲在常量靜態變量中(創建只完成一次)。

如果你確實使用ARC,你就全部設置好了。如果沒有,釋放你的對象(使用dealloc方法)