0

UIImageView に image-property を 3 回続けて設定すると (2 回で十分な場合もあります)、アプリがクラッシュします。アプリを閉じる前にメモリの警告が表示されることが何度かありましたが、ほとんどの場合は単に崩壊します。アプリはシミュレーターでクラッシュしないので、メモリの問題であると確信しています。

画像プロパティを設定するときに使用するコードは次のとおりです。

-(void)changeBgPictureTo:(UIImage *)img
{
    [self.backgroundImage setImage:img];
}

UIImages は次の[UIImage imageWithData:]メソッドで割り当てられます。

[UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]];

イメージは最初の 2 回は正しく設定されますが、3 回目でクラッシュします。特定の画像ファイルとは関係ありません。10種類の画像で試しましたが、違いはありません。

UIImageView で以前にロードした画像をアンロードするにはどうすればよいですか?

編集: さて、私はコード全体を求められたので、ここに行きます:

私は次のようなクラスで作業しています:

@interface MyImage : NSObject
{
    UIImage* image;
    int imgId;
    NSArray* colors; //contains 'UIColor' objects.
}

@property (nonatomic, retain) UIImage* image;
@property (nonatomic, retain) NSArray* colors;
@property (nonatomic, readwrite) int imgId;

-(id)initWithFileName:(NSString*)fileName withType:(NSString*)type andId:(int)imgId andColors:(NSArray*)colorArray;

@end

これが初期化の実装です:

-(id)initWithFileName:(NSString*)fileName withType:(NSString*)type andId:(int)imageId andColors:(NSArray*)colorArray
{
     self = [super init];

     if (self)
     {
         self.colors = [NSArray arrayWithArray:colorArray]; 
         self.imgId = imageId;
         self.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]];
     }   

return self;

}

この呼び出しでループに追加される「MyImage」オブジェクトのリストを持つデータコントローラーがあります。

[self.myImages addObject:[[MyImage alloc] initWithFileName:[NSString stringWithFormat:@"0000%d", i] withType:@"jpg" andId:i andColors:colors]];

00001.jpg、00002.jpg、.....、00008.jpg という名前の 9 つの画像があります。

このデータ コントローラーには、次のようなメソッドがあります。

-(MyImage *)getImageWithId:(int)imgId
{
    for (MyImage* img in self.myImages)
    {
        if (img.imgId == imgId)
            return img;
    }
    return nil;
}

getImageWithId メソッドは次のように呼び出されます。

-(void)btnPushed:(id)sender
{
     [self.delegate changeBgPictureTo:[self.imgDataController getImageWithId:((UIButton*)sender).tag]];    
}  

changeBgPictureTo メソッドは、イメージ プロパティの設定を行うメソッドです。

-(void)changeBgPictureTo:(MyImage *)img
{
    NSLog(@"Setting image: %d", img.imgId);
    [self.backgroundImage setImage:img.image];    
}

ログには "Setting image: 0000X:" が 3 回出力されますが、3 回目の出力の直後にクラッシュします。

4

4 に答える 4

2

UIImage オブジェクトを MyObject クラス内に保存する代わりに、ファイルのファイル名のみを保存してみてください。

@interface MyImage : NSObject 
{
    NSString *fileName;//UIImage* image;
    int imgId;
    NSArray* colors; //contains 'UIColor' objects.
}

@property (nonatomic, retain) NSString *fileName;//@property (nonatomic, retain) UIImage* image;
@property (nonatomic, retain) NSArray* colors;
@property (nonatomic, readwrite) int imgId;

-(id)initWithFileName:(NSString*)fileName withType:(NSString*)type andId:(int)imgId andColors:(NSArray*)colorArray;

と実装

-(id)initWithFileName:(NSString*)fileName withType:(NSString*)type andId:(int)imageId   andColors:(NSArray*)colorArray
{
     self = [super init];

     if (self)
     {
         self.colors = [NSArray arrayWithArray:colorArray]; 
         self.imgId = imageId;
         //self.image = [UIImage imageWithData:[NSData dataWithContentsOfFile:[[NSBundle mainBundle] pathForResource:fileName ofType:type]]];
         self.fileName = [[NSBundle mainBundle] pathForResource:fileName ofType:type]];
      }   
      return self;
 }

その後、関数で

 -(void)changeBgPictureTo:(MyImage *)img   
 {
    NSLog(@"Setting image: %d", img.imgId);
    //[self.backgroundImage setImage:img.image];    
    UIImage *img = [UIImage imageWithContentsOfFile:[img fileName]];
    [self.backgroundImage setImage:img];
 }
于 2012-04-27T02:29:41.370 に答える
2

少なくとも、画像配列に追加した後、これらの MyImage インスタンスを解放する必要があります。

[self.myImages addObject:[[MyImage alloc] initWithFileName:[NSString stringWithFormat...

このコードは -

MyImage* img = [[MyImage alloc] initWithFileName:[NSString stringWithFormat... 
[self.myImages addObject:img];
[img release];

または自動解放を使用します。

コードでメモリ リークが発生するはずです。

于 2012-04-27T15:33:04.637 に答える
0

以下を使用して、バンドルから画像を取得してみてください

[UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:@"yourImageName.png" ofType:nil]];
于 2012-04-26T12:45:25.320 に答える
0

メモリ不足の警告を受け取ったときに、特定のプロパティを解放してから使用しようとしたが、nil で作業している可能性はありますか?

シミュレーターでメモリ不足の警告をシミュレートして、クラッシュするかどうかを確認しましたか? ハードウェア > メモリ警告のシミュレート

于 2012-04-27T04:47:00.540 に答える