编译器说有内存泄漏,但我没有看到

Jos*_*ick 2 iphone xcode memory-leaks memory-management objective-c

所以我用Xcode做了那件事,你说分析它发现泄漏和东西,在这里,它说我漏了(在下面的代码中标出).

// Copy dictionary to memory
NSString *filepath = [[NSBundle mainBundle] pathForResource:@"DataCategoriesDictionary" ofType:@"plist"];
NSDictionary *dataCategoriesDictionary = [[NSDictionary alloc] initWithContentsOfFile:filepath];
self.choices = [[NSMutableDictionary alloc] initWithDictionary:[dataCategoriesDictionary objectForKey:self.chosenCategory]]; // LINE 55
[dataCategoriesDictionary release]; // HERE, the compiler says "Potential leak of an object allocated on line 55"
Run Code Online (Sandbox Code Playgroud)

虽然它没有任何意义,我可以渗出了实例变量,我尝试添加释放语句也无妨和Xcode中仍然给了我同样的错误.还有什么我可以泄漏?

zap*_*aph 5

如果选择是具有保留的属性,则会泄漏NSMutableDictionary.

[[NSMutableDictionary alloc] initWithDictionary
Run Code Online (Sandbox Code Playgroud)

自动释放或使用临时.

self.choices = [[[NSMutableDictionary alloc] initWithDictionary:[dataCategoriesDictionary objectForKey:self.chosenCategory]] autorelease];
Run Code Online (Sandbox Code Playgroud)

或(我最喜欢的)

self.choices = [NSMutableDictionary dictionaryWithDictionary:[dataCategoriesDictionary objectForKey:self.chosenCategory];
Run Code Online (Sandbox Code Playgroud)

要么

NSMutableDictionary *tempDict = [[NSMutableDictionary alloc] initWithDictionary:[dataCategoriesDictionary objectForKey:self.chosenCategory]];
self.choices = tempDict;
[tempDict release];
Run Code Online (Sandbox Code Playgroud)

  • 为了最简单,使用方便构造函数`+ dictionaryWithDictionary:`! (2认同)