NSMutableArray addObject в для цикла - утечка памяти - PullRequest
0 голосов
/ 03 марта 2011

Я помещаю строки (которые являются именами файлов в определенной директории) в NSMutableArray с циклом for: h-file:

#import <Three20/Three20.h>

@interface AlbumController : TTThumbsViewController {
    NSMutableArray *images;
}

@property (nonatomic, retain) NSMutableArray *images;

@end

m-file:

#import "AlbumController.h"
#import "PhotoSource.h"
#import "Photo.h"
@implementation AlbumController
@synthesize images;



-(void)createPhotos {
    NSString *bundleRoot = [[NSBundle mainBundle] bundlePath];
    NSArray *dirContents = [[NSFileManager defaultManager] contentsOfDirectoryAtPath:bundleRoot error:nil];
    NSArray *onlyJPGs = [dirContents filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"self ENDSWITH '.jpg'"]];

    NSMutableArray *pics = [[onlyJPGs copy] autorelease];



        if(!self.images) {
 self.images = [[NSMutableArray alloc] init];
}

    for(int i = 0; i < [onlyJPGs count]; i++)
    {
        //NSLog([pics objectAtIndex:i]);


        NSString *ImgURL = [@"bundle://" stringByAppendingString:[pics objectAtIndex:i]];

            Photo *photo = [[Photo alloc] initWithURL:ImgURL smallURL:ImgURL size:CGSizeMake(320, 212)];
[images addObject:photo];
[photo release];

        }



}
-(void)viewDidLoad{

    [self createPhotos]; // method to set up the photos array
    self.photoSource = [[PhotoSource alloc]
                        initWithType:PhotoSourceNormal
                        title:@"Chili Pflanzen"
                        photos:images
                        photos2:nil
                        ];
}

@end

У меня нет проблем в симуляторе, но на моем iPod ...

Сообщение об ошибке:

Data FOrmatters временно недоступны, будут повторяться после «продолжить».(Неизвестная ошибка загрузки разделяемой библиотеки "/Developer/usr/lib/libXcodeDebuggerSupport.dylib")

заранее спасибо

Ответы [ 3 ]

1 голос
/ 03 марта 2011

Похоже, основная проблема связана с

 [images addObject:[[Photo alloc] initWithURL:ImgURL smallURL:ImgURL size:CGSizeMake(320, 212)]];

Здесь вы размещаете фотографию, но не выпускаете ее.Когда вы добавляете объект в массив, он увеличивает его количество.

Попробуйте изменить его на

Photo *photo = [[Photo alloc] initWithURL:ImgURL smallURL:ImgURL size:CGSizeMake(320, 212)];
[images addObject:photo];
[photo release];

Кроме того ...

Iизмените

 self.images = [[[NSMutableArray alloc] init] autorelease];

на

if(!self.images) {
 self.images = [[NSMutableArray alloc] init];
}

В противном случае возможна утечка памяти, если она уже была инициализирована , а также вероятность того, что выне хотите, чтобы он был автоматически освобожден;

1 голос
/ 03 марта 2011

Я думаю, что вы должны использовать mutableCopy, а не копировать в ваш массив изображений.

, поэтому вместо: NSMutableArray * pics = [[onlyJPGs copy] autorelease];Вы должны использовать: NSMutableArray * pics = [[onlyJPGs mutableCopy] autorelease];

Более подробную информацию о copy / mutablecopy в этом вопросе: Copy & mutableCopy?

0 голосов
/ 03 марта 2011

Ваш экземпляр NSMutableArray выпущен автоматически. Вы назначаете его на images ivar. Тот факт, что вы объявили его как сохраняемое свойство, не имеет значения, потому что вы не присваиваете это свойство. Я предполагаю, что вы хотели присвоить свойству, а сбой вызван непреднамеренным освобождением.

Изменение:

images = [[[NSMutableArray alloc] init] autorelease];

... чтобы:

self.images = [[[NSMutableArray alloc] init] autorelease];

... или:

images = [[NSMutableArray alloc] init];

Также обратите внимание, что ваша собственность объявляется как NSArray, когда вы выделяете экземпляр NSMutableArray.

Также см. Руководство по программированию управления памятью .

...