Objective c 这里的漏洞在哪里?

Objective c 这里的漏洞在哪里?,objective-c,xcode,memory-leaks,Objective C,Xcode,Memory Leaks,我不明白这里的漏洞在哪里 我正在查询数据库中的字段。在此之后,我将插入NSMutableArray列表 @property (nonatomic, retain) NSMutableArray *bList; @property (nonatomic, retain) NSString *icon;//Model Model *newModel = [[Model alloc] init]; newModel.icon = [NSString stringWithUTF8String:(c

我不明白这里的漏洞在哪里

我正在查询数据库中的字段。在此之后,我将插入NSMutableArray列表

@property (nonatomic, retain) NSMutableArray *bList;

@property (nonatomic, retain) NSString *icon;//Model

Model *newModel = [[Model alloc] init]; 
newModel.icon = [NSString stringWithUTF8String:(char *) sqlite3_column_text(compiledStatement, 2)];
[self.bList addObject:newModel];
[newModel release];
最后:

- (void)dealloc {
    [self.bList release];
    [super dealloc];
}
不要那样做;使用
self.bList=nil
[bList release],bList=nil

代码中似乎没有泄漏,除非我遗漏了一些明显的东西

请记住,
leaks
标识泄漏的分配位置,而不是泄漏的位置。泄漏可能是由其他地方的过度滞留造成的

不要那样做;使用
self.bList=nil
[bList release],bList=nil

代码中似乎没有泄漏,除非我遗漏了一些明显的东西


请记住,
leaks
标识泄漏的分配位置,而不是泄漏的位置。泄漏可能是由于在其他位置保留过多。

您创建了一个数组实例,但没有占用内存空间。为blist数组分配一个内存空间

self.blist= [[NSMutableArray alloc]init]; // or you can create like
self.blist= [[NSMutableArray alloc]initWithCapacity:100];

您创建了一个数组实例,但没有占用内存空间。为blist数组分配一个内存空间

self.blist= [[NSMutableArray alloc]init]; // or you can create like
self.blist= [[NSMutableArray alloc]initWithCapacity:100];

根据您对
@murat
答案的评论,如果您正在这样做

self.blist = [[NSMutableArray alloc] init];
然后,当您在该行中两次取得所有权时,您正在泄漏内存。一个是基于
alloc init
的,另一个是基于属性的(假设它是
retain
ed,大多数情况下应该是这样)。在这种情况下,在
dealloc
中释放它一次不会平衡
retainrelease
调用。你将不得不这样做

self.blist = [NSMutableArray array]; 


根据您对
@murat
答案的评论,如果您正在这样做

self.blist = [[NSMutableArray alloc] init];
然后,当您在该行中两次取得所有权时,您正在泄漏内存。一个是基于
alloc init
的,另一个是基于属性的(假设它是
retain
ed,大多数情况下应该是这样)。在这种情况下,在
dealloc
中释放它一次不会平衡
retainrelease
调用。你将不得不这样做

self.blist = [NSMutableArray array]; 


但在添加对象部分之前执行此操作,这样我就不会看到任何内存泄漏。可能不执行[self.blist release]在未发布[blist release]的情况下执行此操作阵列将根据需要进行扩展
allocWithCapacity:
从来都不是必需的。但在添加对象部分之前执行此操作,这样我就不会看到任何内存泄漏。可能不执行[self.blist release]在未发布[blist release]的情况下执行此操作阵列将根据需要进行扩展<代码>允许容量:
从来都不是必需的。为什么不[self.bList release];?因为你最后会有一个悬空的指针。在这种情况下这真的不重要,但这是一种风格。为什么不[self.bList release];?因为你最后会有一个悬空的指针。在这种情况下这真的不重要,但这是一种时尚。不,还没有。到现在为止,我浪费了半天的时间去寻找一些东西……不,还没有。到现在为止,我已经浪费了半天的时间来寻找一些东西……在这种情况下,您发布的
blist
超出了需要。在这里,您仅获得一次所有权,并且仅在
dealloc
中放弃所有权。这将平衡内存管理调用。如果此移动出现问题,则您必须删除
blist
上的其他释放调用。在这种情况下,您释放的
blist
超出了需要。在这里,您仅获得一次所有权,并且仅在
dealloc
中放弃所有权。这将平衡内存管理调用。如果此移动是一个问题,那么您必须删除
blist
上的其他释放调用。