Iphone 具有3个NSMutableArray的类中存在内存泄漏。为什么?

Iphone 具有3个NSMutableArray的类中存在内存泄漏。为什么?,iphone,xcode,instruments,memory-leaks,Iphone,Xcode,Instruments,Memory Leaks,我在我创建的一个类中发现了一个内存泄漏。这是一节课: h 这个类有3个NSMutableArray,我将在其中存储数据。为了准备和初始化这个类,我在创建3个数组的地方开发了initialize方法。在Dealoc中,这些数据被释放 每次使用此类时,泄漏工具都会检测到泄漏,因为initialize方法无效 初始化这些数组的最佳方法是什么 谢谢 编辑 嗨,我已经用RDItem解决了这个漏洞,但现在出现了另一个类似类的lear: h 现在我发现这些管线有漏洞: self.items = [NSMuta

我在我创建的一个类中发现了一个内存泄漏。这是一节课:

h

这个类有3个NSMutableArray,我将在其中存储数据。为了准备和初始化这个类,我在创建3个数组的地方开发了initialize方法。在Dealoc中,这些数据被释放

每次使用此类时,泄漏工具都会检测到泄漏,因为initialize方法无效

初始化这些数组的最佳方法是什么

谢谢

编辑

嗨,我已经用RDItem解决了这个漏洞,但现在出现了另一个类似类的lear:

h

现在我发现这些管线有漏洞:

self.items = [NSMutableArray array];
self.colors = [NSMutableArray array];
self.textures = [NSMutableArray array];
self.styles = [NSMutableArray array];
任何人都能解释为什么现在发生在这堂课上而不是在RDItem课上?都一样:(


谢谢。

这是一个更好的建议实施方案

-(void)initialize
{
    self.colors = [NSMutableArray array];
    self.textures = [NSMutableArray array];
    self.styles = [NSMutableArray array];
}
-(void)dealloc
{
    self.colors = nil;
    self.textures = nil;
    self.styles = nil;
}

在没有看到初始化RDItem的代码的情况下,我无法确定


但是我希望您在创建新的RDItem之前不会发布以前的RDItem。因此,请将代码张贴在您创建RDItem的位置,这样我们就可以确定,只要在需要时调用
init
就可以了。调用
alloc
init
将保留内容为
nil
的数组。调用
alloc
de>initWithObjects:并填充数组。

我认为您得到了泄漏,因为您多次调用初始化消息,并且没有释放变量

通常,您应该使用setter或getter来访问IVAR,以便调用适当的操作(如在setter上分配新值之前的释放消息)


记住调用[super dealloc]作为dealloc;)的最后一条指令。

我认为,泄漏发生在填充代码的数组中,而不是init。例如,您分配并初始化一些NSString,并将其放入NSMutable数组中,而不释放或自动释放它。或者类似的事情。让舒尔正确地填充阵列。

尽管该实现似乎不会对您共享的代码行造成真正的内存泄漏。虽然我分享了一个更好的实现,但是你的代码没有泄漏。但我有几个问题:1)调用“初始化”方法多少次?2) 您是否释放插入可变数组的对象?并且不要忘记
[super dealoc]。这是应用的解决方案:)谢谢@samfisher,你能解释一下为什么你选择将它们设置为
nil
而不是
release
ing吗?我原以为
nil
只为
viewDidUnload
中的IBOutlets设置的them@iNoob,self.object=nil调用您的setter,这将释放旧值,将成员设置为nilSee here(),以了解使用
@property
@synthesis
时“幕后”发生的情况。可能会帮助您更好地理解这些概念
#import <Foundation/Foundation.h>

@interface RDTema : NSObject {

}
@property int Id;
@property (nonatomic, retain) NSString *idManifest;
@property (nonatomic, retain) NSString *idTema;
@property (nonatomic, retain) NSString *nombre;
@property (nonatomic, retain) NSString *thumbnail;
@property (nonatomic, retain) NSString *thumbnailPush;

@property (nonatomic, retain) NSMutableArray *items;

@property (nonatomic, retain) NSMutableArray *colors;
@property (nonatomic, retain) NSMutableArray *textures;
@property (nonatomic, retain) NSMutableArray *styles;

-(void)initialize;
@end
#import "RDTema.h"


@implementation RDTema
@synthesize Id;
@synthesize idManifest;
@synthesize idTema;
@synthesize nombre;
@synthesize thumbnail;
@synthesize thumbnailPush;

@synthesize items;

@synthesize colors;
@synthesize textures;
@synthesize styles;

-(void)initialize
{
    /*
    self.items = [[NSMutableArray alloc] init];
    self.colors = [[NSMutableArray alloc] init];
    self.textures = [[NSMutableArray alloc] init];
    self.styles = [[NSMutableArray alloc] init];
     */

    self.items = [NSMutableArray array];
    self.colors = [NSMutableArray array];
    self.textures = [NSMutableArray array];
    self.styles = [NSMutableArray array];
}
-(void)dealloc
{
    [idManifest release];
    [idTema release];
    [nombre release];
    [thumbnail release];
    [thumbnailPush release];

    [items release];
    [colors release];
    [textures release];
    [styles release];

    [super dealloc];
}
self.items = [NSMutableArray array];
self.colors = [NSMutableArray array];
self.textures = [NSMutableArray array];
self.styles = [NSMutableArray array];
-(void)initialize
{
    self.colors = [NSMutableArray array];
    self.textures = [NSMutableArray array];
    self.styles = [NSMutableArray array];
}
-(void)dealloc
{
    self.colors = nil;
    self.textures = nil;
    self.styles = nil;
}