-1

これら2つの方法でメモリリークの警告が表示されます。2番目のものは最初のものと明らかにそのリークメモリを呼び出します。何か案は?

static UIColor *subtreeBorderColor(void) 
{
    return [UIColor colorWithRed:0.0f green:0.5f blue:0.0f alpha:1.0f];
}


- (void) updateSubtreeBorder 
{
    CALayer *layer = [self layer];
    if (layer) {


        // If the enclosing TreeGraph has its "showsSubtreeFrames" debug feature enabled, 
        // configure the backing layer to draw its border programmatically.  This is much more efficient
        // than allocating a backing store for each SubtreeView's backing layer, only to stroke a simple
        // rectangle into that backing store.

        PSBaseTreeGraphView *treeGraph = [self enclosingTreeGraph];
        if ([treeGraph showsSubtreeFrames]) {
            [layer setBorderWidth:subtreeBorderWidth()];
            [layer setBorderColor:[subtreeBorderColor() CGColor]];

        } else {
            [layer setBorderWidth:0.0];
        }


    }
}

//3: Potential leak of an object
//6: Calling 'subtreeBorderColor'
//1: Entered call from 'updateSubtreeBorder'
//13: Method returns an Objective-C object with a +0 retain count
//12: Reference count incremented. The object now has a +1 retain count
//6: Returning from 'subtreeBorderColor'
//13: Object leaked: allocated object is not referenced later in this execution path and has a retain count of +1

更新2:コードを完全に変更し、一時ファイルを削除してソリューションをクリーンアップしました。これが表示されます。コードすら存在しない場合にエラーが検出されます。

ここに画像の説明を入力してください

4

3 に答える 3

2

単純。関数内での呼び出しは必要ありません- retain。それはまさに、自動解放パターンが発明されたものです。alloc-init を使用して UIColor オブジェクトを作成しないため、所有権を取得しません。メモリ管理を過度に複雑にする必要はありません。:)

編集:(将来の反対票を防ぐために)質問とコードを編集して、保持されたオブジェクトを誤って返さないようにしたため、前のステートメントは無効になりました。はい、Xcode は、「コードすらありません」というメモリ リークに関するこの通知を表示します。これは奇妙です。はい、おそらくコンパイラのバグです。それでも、一時的な (そして私の意見では完全に有効な) 回避策は、関数の代わりに定義を使用することです。代わりにこれを書いた場合、Xcode が何を言うか見てみましょう:

#define SUBTREE_BORDER_COLOR [UIColor colorWithRed:0.0f green:0.5f blue:0.0f alpha:1.0f]
于 2012-10-01T14:24:10.030 に答える
0

「保持」をそのまま使用したい場合は、メソッドUIColorから返されたオブジェクトを「解放」する必要もありますsubtreeBorderColor

これが私のコードだったら、retainそもそも自動解放されたオブジェクトに対して " " を実行しません。または、それよりも優れているのは、単に ARC を有効にしてコードを実行することです。

于 2012-10-01T14:23:59.757 に答える
-1

前の答えはどちらも正しい

ただし、何らかの理由でメソッドによって返されるオブジェクトを保持する必要がある場合は、規則に従って、メソッドの名前を「new」で始まる名前に変更してください (または、alloc、retain、または copy)。返されたオブジェクトは保持されるため、呼び出し元のコードは、後で必要に応じてオブジェクトを解放する責任があることを認識しています...

于 2012-10-01T14:30:07.017 に答える