2

だから私はこれに対する答えを探していましたが、まだそれを理解することができません. 15 個程度の画像を含む配列があるため、UITableViewCell のサブビューを使用して表示しようとしています。以下のコード - 問題を修正するために autorelease/release を使用して言及したものはすべて読んだことがありますが、それを行おうとすると単純に ARC エラーが発生します。どんな助けでも大歓迎です。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }
    int countthis = indexPath.row;
    NSString *image = imgarr[countthis];
    UIImageView *iv = [[UIImageView alloc] initWithFrame:(CGRect){.size={320, tableView.rowHeight}}];
    iv.image = [UIImage imageNamed:image];
    cell.imageView.image = iv.image;
    return cell;
}
4

3 に答える 3

2

ドメインに関係なく、大きなファイルは問題を引き起こす傾向があります。具体的には、Apple は次のように述べています。

サイズが 1024 x 1024 を超える UIImage オブジェクトを作成することは避けてください。

画像のサイズを変更しようとしているように見えますが、UIImages は不変です。したがって、割り当てられた UIImageView は、プロセッサ サイクルを無駄にするだけです。

縮小する必要がある大きな画像で立ち往生している場合は、セルに割り当てる前に拡大縮小を検討してください。これらのルーチンが役に立つかもしれません: UIImage のサイズを変更する最も簡単な方法は?

re autorelease/release: これらは ARC 以降非推奨になっています。コードがメモリ リークしているようには見えません。私はそれを汗をかきません。ただし、質問を編集して、クラッシュに関する詳細を含める必要があります。

于 2013-09-20T00:48:27.060 に答える
0

コードをこれまでクリーンアップできます。これにより、パフォーマンスがわずかに向上する可能性があります。indexPath.rowを に変換する必要はありません。これは、アーキテクチャに依存する型 (32 ビットのint場合NSIntegerは int、64 ビットの場合は long) であるためです。self.imgarrおそらくクラスのプロパティであるため、おそらく使用することもできます。画像の変更は、ニールが述べたとおりです。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *CellIdentifier = @"Cell";
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) {
        cell = [[UITableViewCell alloc]initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier];
    }

    NSString *image = self.imgarr[indexPath.row];
    cell.imageView.image = [UIImage imageNamed:image];
    return cell;
}

自動リリース/リリースに関しては、それらを使用してARCエラーが発生していると述べました。これは、iOS 5以降のSDKを使用していることを示しています. それらはコードで必要なくなりました。

于 2013-09-20T00:53:56.063 に答える
0

CGImageSourceCreateThumbnailAtIndexテーブルビューに表示する前に、 firstを使用して画像のサイズを変更できます。

サイズを変更したい画像へのパスがある場合は、これを使用できます。

- (void)resizeImageAtPath:(NSString *)imagePath {
    // Create the image source (from path)
    CGImageSourceRef src = CGImageSourceCreateWithURL((__bridge CFURLRef) [NSURL fileURLWithPath:imagePath], NULL);

    // To create image source from UIImage, use this
    // NSData* pngData =  UIImagePNGRepresentation(image);
    // CGImageSourceRef src = CGImageSourceCreateWithData((CFDataRef)pngData, NULL);

    // Create thumbnail options
    CFDictionaryRef options = (__bridge CFDictionaryRef) @{
            (id) kCGImageSourceCreateThumbnailWithTransform : @YES,
            (id) kCGImageSourceCreateThumbnailFromImageAlways : @YES,
            (id) kCGImageSourceThumbnailMaxPixelSize : @(640)
    };
    // Generate the thumbnail
    CGImageRef thumbnail = CGImageSourceCreateThumbnailAtIndex(src, 0, options); 
    CFRelease(src);
    // Write the thumbnail at path
    CGImageWriteToFile(thumbnail, imagePath);
}

詳細はこちら

于 2014-09-01T11:07:19.180 に答える