簡體   English   中英

iOS內存管理困惑

[英]iOS memory management confused

我在實用程序類中有一個靜態方法:

+ (Division *) getDefaultDivision
{
    Division *defaultDivision = [[Division alloc] init];
    defaultDivision.Id = 0;
    defaultDivision.name = @"Accounting";
    defaultDivision.slug = @"accounting";

    return defaultDivision;
}

在我的ViewController中,我做類似的事情:

Division *div = [[Division alloc] init];
div = [Utilities getDefaultDivision];

但是當我分析時,它說“分配給第x行並存儲到defaultDivision的對象的潛在泄漏”。

如果我使用:

Division *defaultDivision = [[[Division alloc] init] autorelease];

它可以工作一次,但是當我再次使用它時,它會崩潰。

只是想知道在這里應該做什么?

如果這是您的真實代碼;

Division *div = [[Division alloc] init];
div = [Utilities getDefaultDivision];

您首先要分配一個Division並將其保存在div中,然后從getDefaultDivision中獲得一個新分區,也將其存儲在div中而無需釋放第一個分區。

無論如何實現“ getDefaultDivision”,此代碼都存在泄漏:

Division *div = [[Division alloc] init];
div = [Utilities getDefaultDivision];

第1行分配內存,並分配div指向該內存。 必須在某個時候釋放此內存。 但是在第2行之后,這變得不可能了,因為div現在有了一個新值-並且指向第1行中分配的內存的指針丟失了 這是泄漏。 除非您了解原因,否則您將陷入困境。

至於這種方法:

+ (Division *) getDefaultDivision
{
    Division *defaultDivision = [[Division alloc] init];
    defaultDivision.Id = 0;
    defaultDivision.name = @"Accounting";
    defaultDivision.slug = @"accounting";
    return defaultDivision;
}

有時稱為“工廠”方法-一種靜態實用程序方法,用於分配,初始化和返回對類的新實例的引用。 此處的最佳做法是在工廠方法中使用自動釋放。 例如:

Division *defaultDivision = [[[Division alloc] init] autorelease];

為什么是最佳做法? 根據Apple的內存管理指南,只有其中包含以下術語的方法才應返回對調用者負責釋放的對象的引用:

alloc, allocWithZone:, copy, copyWithZone:, mutableCopy, mutableCopyWithZone:

-來自http://developer.apple.com/library/IOs/#documentation/General/Conceptual/DevPedia-CocoaCore/MemoryManagement.html

由於“ getDefaultDivision”不是“ alloc”或“ copy”方法(它是訪問器方法),因此它不應返回指向對象的指針,調用者以后必須釋放該對象以避免泄漏。 將新分配的返回內存標記為自動釋放是遵循此合同的一種方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM