NSMutableArray forObject for for循环 - 内存泄漏

时间:2011-03-03 12:38:17

标签: objective-c ios4 memory-leaks for-loop nsmutablearray

我将字符串(在某个目录中是文件的文件名)放入带有for循环的NSMutableArray中: h文件:

#import <Three20/Three20.h>

@interface AlbumController : TTThumbsViewController {
    NSMutableArray *images;
}

@property (nonatomic, retain) NSMutableArray *images;

@end

m文件:

#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上......

错误讯息:

数据FOrmatters暂时不可用,将在“继续”后重试。 (加载共享库时出现未知错误“/Developer/usr/lib/libXcodeDebuggerSupport.dylib”)

提前致谢

3 个答案:

答案 0 :(得分:1)

看起来主要问题是

 [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];

另外......

我要改变

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

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

否则如果已经初始化,则可能存在内存泄漏,以及您可能不希望它自动释放;

答案 1 :(得分:1)

我认为你应该使用mutableCopy而不是复制你的pics数组。

所以代替:     NSMutableArray * pics = [[onlyJPGs copy] autorelease]; 你应该使用:     NSMutableArray * pics = [[onlyJPGs mutableCopy] autorelease];

有关此问题中的复制/可变复制的更多信息:Copy & mutableCopy?

答案 2 :(得分:0)

您的NSMutableArray实例已自动释放。您正在将其分配给images ivar。您已将其声明为保留属性这一事实并不重要,因为您没有将其分配给该属性。我的猜测是你打算分配给属性,崩溃是由无意中的释放造成的。

变化:

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

...为:

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

...或:

images = [[NSMutableArray alloc] init];

另请注意,在分配NSArray的实例时,您的属性会声明为NSMutableArray

另见the Memory Management Programming Guide