1

次のコードでは、xCode の Build & Analyze 関数が

165 行目に割り当てられ、「addButton」に格納されたオブジェクトの潜在的なリーク。

addButton は、自動解放されたオブジェクトを返すカテゴリ barItemWithImage (ここで読んだもの) を使用する UIBarButtonItem です。addButtonItem を保持しないと、解放されたオブジェクトにアクセスしようとすると例外が発生します。

ここで何が欠けていますか?

        UIBarButtonItem *addButton;

    if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        addButton = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"RedPlus.png"] target:self action:@selector(createStoryModal:)];
    }else {
        addButton = [UIBarButtonItem barItemWithImage:[UIImage imageNamed:@"RedPlusiPhone.png"] target:self action:@selector(createStoryModal:)];
    }

    [addButton retain];

    NSArray* toolbarItems = [NSArray arrayWithObjects:
                             addButton,
                             [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemFlexibleSpace 
                                                                           target:nil
                                                                           action:nil],
                             nil];

    [toolbarItems makeObjectsPerformSelector:@selector(release)];
    self.toolbarItems = toolbarItems;

カテゴリ コード:

    @implementation UIBarButtonItem(MyCategory)

+ (UIBarButtonItem*)barItemWithImage:(UIImage*)image target:(id)target action:(SEL)action{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    [button setImage:image forState:UIControlStateNormal];
    [button setFrame:CGRectMake(0.0, 0.0, image.size.width, image.size.height)];
    [button addTarget:target action:action forControlEvents:UIControlEventTouchUpInside];

    return [[[UIBarButtonItem alloc] initWithCustomView:button] autorelease];
}

@終わり

4

2 に答える 2

2

アイテムは最初は自動解放されたオブジェクトですが、保持メッセージを送信すると、このオブジェクトの所有者になります。つまり、解放する必要があります。addButtonは現在リリースされていないため、リークが発生します。

さらに、toolBarItems 配列で UIBarButtonItem を割り当て/初期化します。この UIBarButtonItem も解放しません。

toolbarItems 配列は、配列で割り当て/初期化する addButton と UIBarButton の両方の保持カウントを増加させるため、その配列を宣言した後で両方を安全に解放できます。(または、わかりやすくするためself.toolbarItemsに、その配列になるように設定した後。)

于 2012-07-17T18:32:24.177 に答える
2

静的アナライザーは正しいです。

これを削除します:

[addButton retain];

この:

[toolbarItems makeObjectsPerformSelector:@selector(release)];

そして、あなたも漏れていUIBarButtonItemます。

NSArrayその要素を保持します。

他にもメモリの問題がある可能性がありますが、これで 3 つの目に見える問題/悪いフォームが取り除かれます。

于 2012-07-17T18:32:52.060 に答える