0

私はObjective-Cプログラミングの初心者で、典型的なメモリの問題を抱えています。ナビゲーション コントローラーに基づいてアプリを実行する必要があり、(プッシュ ビュー コントローラーを使用して) いくつかのビューを渡すときに、100 個の画像のアニメーションをロードします。シミュレーターではうまくいきますが、電話ではそうではありません... さまざまなアニメーションを開いてから閉じます。それを避けるためにアークを使用していますが、機能していないようです。また、アークを無効にして UIImageView を手動で解放しようとしましたが、すぐにクラッシュします。そのビューの 1 つの例を次に示します。

    //.h
@interface Gegant_nou : UIViewController {

IBOutlet UIImageView *ImageViewGegant; 
}

@property (nonatomic, strong) UIImageView* ImageViewGegant;

//.m

- (void)viewDidLoad {

    [super viewDidLoad];


    UIBarButtonItem *rigthButton = [[UIBarButtonItem alloc] initWithTitle:@"Detalls" style:UIBarButtonItemStyleBordered target:self action:@selector(canviarDetalls)];
    self.navigationItem.rightBarButtonItem = rigthButton;
    [rigthButton release];


    ImageViewGegant.animationImages =@
        [[UIImage imageNamed:@"0001.png"],
        [UIImage imageNamed:@"0002.png"],
        . load all the images
        .
        [UIImage imageNamed:@"0099.png"],
        [UIImage imageNamed:@"0100.png"]];

    ImageViewGegant.animationDuration = 4;
    ImageViewGegant.animationRepeatCount = 0;
    [ImageViewGegant startAnimating];
    [self.view addSubview:ImageViewGegant];

    self.title = @"Gegant nou";

    [ImageViewGegant release];

}

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil{

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];
    // Release any cached data, images, etc that aren't in use.

}

- (void)viewDidUnload{
    [super viewDidUnload];
    [ImageViewGegant release];
}

なぜ起こるのか考えはありますか?助けてくれてありがとう!

4

2 に答える 2

1

問題がどこにあるかについての詳細情報を提供するために、クラッシュログまたはスタックトレースを提供すると、支援が容易になります。

問題がメモリに関連していることを完全に確信していますか?ARCを使用しているため、コードベースにARCを使用しない部分がない場合、またはCoreGraphicsなどのcライブラリを使用している場合を除き、ARCを使用しても保持/解放する必要があります。

たとえばオーバーリリースでメモリの問題が発生し、EXC_BAD_ACCESSがクラッシュした場合は、[製品]->[スキームの編集]->[診断]、[ゾンビオブジェクトの有効化]の順にアプリでゾンビを有効にしてみてください。これにより、問題の原因となっているオブジェクトの詳細情報が提供されることを願っています。

まったく別のトピックについては、すべてのインスタンス変数をキャメルケースで作成することを強くお勧めします。読むのは紛らわしいですが、ほとんどの開発者は「ImageViewGegant」がクラスの名前であると想定します。

于 2012-09-29T19:05:53.753 に答える
0

問題が解決しました!何が起こっていたかというと、私は UIImageNamed を使用してアニメーションをロードしていました.ARC を使用していましたが、UIImageNamed は画像をロードしますが、解放しないため、すべてのフレームをロードしてメモリをすぐにいっぱいにします. 今、私はその記憶の問題を抱えていません。全てに感謝!

于 2012-10-06T19:57:30.820 に答える