1

最近メモリ クラッシュが発生しており、配列を空にできていないのではないかと疑っています。これは配列のコードです。

- (void)viewDidLoad
{
   allImagesArray = [[NSMutableArray alloc] init];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *location=@"Bottoms";
    NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location];
    NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: fPath];
    collectionBottoms.delegate =self;
    collectionBottoms.dataSource=self;
    for(NSString *str in directoryContent){
        NSLog(@"i");
        NSString *finalFilePath = [fPath stringByAppendingPathComponent:str];
        NSData *data = [NSData dataWithContentsOfFile:finalFilePath];
        if(data)
        {
            UIImage *image = [UIImage imageWithData:data];
            [allImagesArray addObject:image];
            NSLog(@"array:%@",[allImagesArray description]);

        }}
}

配列内のオブジェクトを解放してメモリを解放するにはどうすればよいですか?

4

3 に答える 3

1

画像配列を Plist に保存します。保存後、配列を再初期化するだけで、配列内のメモリがクリアされます。では、ARC を使用していますか?これはARCの方が快適だからです。次に、-viewWillDisappear で配列から AllObject を再初期化または削除します

于 2013-10-25T04:27:06.737 に答える
0

この画像配列 を使用しているallImagesArray場合は、ビューが表示されているときに、このコードをviewWillAppearまたはviewDidAppearのメソッドに挿入しUIViewControllerます。

- (void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];

   allImagesArray = [[NSMutableArray alloc] init];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *location=@"Bottoms";
    NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location];
    NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: fPath];
    collectionBottoms.delegate =self;
    collectionBottoms.dataSource=self;
    for(NSString *str in directoryContent){
        NSLog(@"i");
        NSString *finalFilePath = [fPath stringByAppendingPathComponent:str];
        NSData *data = [NSData dataWithContentsOfFile:finalFilePath];
        if(data)
        {
            UIImage *image = [UIImage imageWithData:data];
            [allImagesArray addObject:image];
            NSLog(@"array:%@",[allImagesArray description]);

        }
    }
}

そして、 の viewWillDisappear/viewDidDisappear メソッドで解放しますUIViewController

- (void)viewDidDisappear:(BOOL)animated
{
    [super viewDidDisappear:animated];

    [allImagesArray removeAllObjects];
    //[allImagesArray release]; // (Uncomment) Call this only if you are not using ARC.
}

または、迅速で汚いが安全な修正は(の使用法を知らなくてもallImagesArray)-

- (void)viewDidLoad
{
    [super viewDidLoad];

     // Remove previously added objects.
     if (allImagesArray != nil && allImagesArray.count > 0) {
            [allImagesArray removeAllObjects];
     }
     // Allocate memory if not done earlier (i.e. first time).
     if (allImagesArray == nil) {
        allImagesArray = [[NSMutableArray alloc] init];
     }

     // Rest of your code as stated in your question
}
于 2013-10-25T04:26:33.060 に答える
0

こんにちは オブジェクトの動作が終了したら、メモリを解放してください。これがあなたのためのコードです。

- (void)viewDidLoad
{
   allImagesArray = [[NSMutableArray alloc] init];
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    NSString *location=@"Bottoms";
    NSString *fPath = [documentsDirectory stringByAppendingPathComponent:location];
    NSArray *directoryContent = [[NSFileManager defaultManager] directoryContentsAtPath: fPath];
    collectionBottoms.delegate =self;
    collectionBottoms.dataSource=self;
    for(NSString *str in directoryContent)
    {
        NSString *finalFilePath = [fPath stringByAppendingPathComponent:str];
        NSData *data = [NSData dataWithContentsOfFile:finalFilePath];
        if(data)
        {
            UIImage *image = [UIImage imageWithData:data];
            [allImagesArray addObject:image];
            NSLog(@"array:%@",[allImagesArray description]);
        image = nil;

        }
    finalFilePath=nil;
    data=nil;
   }

 paths= nil;
 documentsDirectory= nil;
 location= nil;
 fPath= nil;
 directoryContent = nil;
}
于 2013-10-25T04:43:18.743 に答える