我可以在目标C中以另一种方法(不保留)释放一个对象(在方法中创建)吗?
我的代码如下
- (NSMutableDictionary *)returnningMyMutableDictionary {
NSMutableDictionary * myDict = [[NSMutableDictionary alloc] init];
[myDict setObject:@“我的名字”forKey:@“name”];
[myDict setObject:@“99”forKey:@“age”];
返回myDict;
}
- (无效)mainmethod {
NSMutableDictionary * dict = [self returnningMyMutableDictionary];
NSLog(@"dict %@",dict); dict = nil; [dict release];
}
Q1)在“mainmethod”中发布返回字典是不错的做法?
Q2)当我在仪器中运行应用程序时,我会在下一部分中泄漏。
[myDict setObject:@“我的名字”forKey:@“name”];
如何避免内存泄漏?
请帮帮我..谢谢您的帮助..
答案 0 :(得分:4)
从第一个函数自动释放。
返回[myDict autorelease];
在释放之前,不要将dict分配给nil 。那是你的内存泄漏。事实上,现在它是自动释放的,根本不发布它。
答案 1 :(得分:1)
替代解决方案
- (NSMutableDictionary *)returnningMyMutableDictionary {
NSMutableDictionary * myDict = [[[NSMutableDictionary alloc] init] autorelease];
现在亚历克斯说正确的第一个释放对象然后分配nil;
答案 2 :(得分:1)
只要方法负责首先创建对象,从另一个方法释放已分配的对象没有任何错误。
在您的示例中可能看起来不是这种情况,但如果您在行之间查看 mainmethod 是请求新NSMutableDictionary的方法。
在这种意义上,您应该遵循在负责创建新对象的方法中添加new / alloc的命名模式。
你通常会保留对象并以dealloc释放它,但你并非总是如此。
一般情况下,如果您可以控制释放对象,请避免使用自动释放。
-(NSMutableDictionary *)allocMutableDictionary
{
NSMutableDictionary *myDict = [[NSMutableDictionary alloc] init];
[myDict setObject:@"My Name" forKey:@"name"];
[myDict setObject:@"99" forKey:@"age"];
return myDict;
}
-(void)mainmethod
{
NSMutableDictionary *dict = [self allocMutableDictionary];
NSLog(@"dict %@",dict);
dict = nil; //making the dict nil means you don't actually release it in the next line
[dict release];
}