2

「余分なループ」を実行する前の割り当て 「クラッシュ」ループを実行する前の割り当て

コード:

// loading items to the array, there are no memory warnings after this is completed. The first allocations screenshot is after this code and before extra loop code.
NSMutableArray *albumCovers = [[NSMutableArray alloc] init];
for (MPMediaQuery *query in queries) {
    NSArray *allCollections = [query collections];
    for (MPMediaItemCollection *collection in allCollections) {
        MPMediaItemArtwork *value = [collection.representativeItem valueForProperty:MPMediaItemPropertyArtwork];
                UIImage *image = [value imageWithSize:CGSizeMake(100, 100)];
                if (image) {
                    [albumCovers addObject:image];
                }
            }
        }
    }
    _mediaCollections = [NSArray arrayWithArray:artworkedCollections];
    _albumCovers = [NSArray arrayWithArray:albumCovers];
}

そして他の場所:

// !!!!! extra loop - from here the memory starts to grow and never release
for (i=0; i< 800; i++) {
    UIImage * coverImage = [_albumCovers objectAtIndex:indexPath.row];
    [veryTemp setImage:coverImage]; // exactly this line adds to the memory. with this line commented, there is no problem.
}

「余分なループ」を実行した後の割り当て 「クラッシュ」ループを実行する前の割り当て

明確にするために、only-obj-c をオンにし、システム ライブラリをオフにしてスタックを呼び出します (それらをオンにすると、最も重いメソッドごとに最大 % が 0.9% になります) 余分なループ後のコール スタック

私はいくつかの調査を行い、stackoverflowで、これらVM:ImageIO_PNG_Dataは通常 から来ていることを発見しましたが[UIImage imageNamed:]、ご覧のとおり、私はこのメソッドを使用していませんMPMediaItemCollection

4

2 に答える 2

1

問題は、UIImage が通常、小さなものである ref(CGImageRef) だけを保持することでした。アイテムを表示した後、CGImageRef に情報が「注入」されました。その結果、テーブルは常に成長していました。

シンプルですが、最も美しいとは言えない解決策は、次のコードを使用することでした。

NSArray = @[obj1, obj2, obj3]; // where obj is custom NSObject and has a UIImage property

それ以外の:

NSArray = @[img1, img2, img3]; // where img is of UIImage type
于 2013-11-21T09:25:25.897 に答える
0

@autoreleaseプールでラップ?

また、なぜveryTemp(だと思いますUIImageView)の画像を800回設定してい[veryTemp setImage:coverImage];ますか?

ついに:

[_albumCovers objectAtIndex:indexPath.row];

indexPath.rowループ内のまったく同じインデックス ( ) で画像オブジェクトを取得しています。コードで何を達成しようとしているのかよくわかりませんか?

于 2013-10-04T13:53:19.897 に答える