我可以在目标C中以另一种方法(不保留)释放对象(在方法中创建)吗?

时间:2010-11-23 10:26:02

标签: iphone objective-c memory-management

我可以在目标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”];

如何避免内存泄漏?

请帮帮我..谢谢您的帮助..

3 个答案:

答案 0 :(得分:4)

  1. 从第一个函数自动释放。

    返回[myDict autorelease];

  2. 在释放之前,不要将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];
}