过去两天我花在寻找内存泄漏上。我阅读了文档,并在互联网上搜索了很多信息(例如Owen Goss“在iOS应用程序中查找和修复内存泄漏”),但我仍然有太多的谜团需要解决。
例如,这段代码一次又一次地在仪器中亮起。我尽我所能但却无法修复它。
- (void) updateUserDefaults
{
// alloc temporary Array for object´s positions
NSMutableArray *tArray = [[NSMutableArray alloc] init];
// store locations of objects
for (int i=0; i<[originalOrigins count]; ++i) {
CGPoint foo = [self.view viewWithTag:100+i].center;
NSString *moo = NSStringFromCGPoint(foo);
[tArray addObject:moo];
[moo release]; //?
}
// retrieve all stored positions for all objects
NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain];
// replace with objects from this level
[zettelPannedOrigins replaceObjectAtIndex:zettelAtIndexInTonebank withObject:tArray];
// save
[[NSUserDefaults standardUserDefaults] setObject:zettelPannedOrigins forKey:@"zettelPannedOrigins"];
[[NSUserDefaults standardUserDefaults] synchronize];
// clean up memory
[tArray release];
[zettelPannedOrigins release]; //?
}
我认为其他人也可能感兴趣的是,我发布了我分配的内容。但它仍然在泄漏。我无法回答文档。或者我可以吗?
答案 0 :(得分:9)
NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] retain];
保留计数为2,因为mutableCopy
会保留一次,而您再次呼叫retain
。请勿在此处致电retain
。
请注意,如果您在名称中使用new
,alloc
,retain
或copy
来调用方法,则您拥有该对象并且保留计数会增加。
答案 1 :(得分:1)
[NSObject mutableCopy];
会返回一个对象,其retainCount增加1,因此您不需要另一个'retain'。
NSMutableArray *zettelPannedOrigins = [[[[NSUserDefaults standardUserDefaults] objectForKey:@"zettelPannedOrigins"] mutableCopy] autorelease];
这应该做的工作:)