【问题标题】:when release objects in objective C在目标 C 中释放对象时
【发布时间】:2012-10-12 15:34:07
【问题描述】:

当我必须释放一个对象时,我在某些情况下感到困惑?所以我想知道我们什么时候在目标C中释放对象。我可以在分配对象的地方使用自动释放自动释放的任何缺点吗?在哪里释放以下对象?

案例一:

SelectFrame *obj=[[SelectFrame alloc]initWithNibName:@"SelectFrame" bundle:nil];
[[self navigationController] pushViewController:obj animated:YES];

案例 2:

UIView *barView=[[UIView alloc]initWithFrame:CGRectMake(0, 500, 200,50)];
barView.backgroundColor=[UIColor redColor];
[self.view addSubview:barView];

案例 3:

NSURLRequest *request = [NSURLRequest requestWithURL:
                         [NSURL URLWithString:@"https://xxxxxxxxxxxxxxxxx"]];
[[NSURLConnection alloc] initWithRequest:request delegate:self];

【问题讨论】:

    标签: iphone ios memory-management


    【解决方案1】:

    是的,以上两种情况都需要放行。

    案例 1:

    SelectFrame *obj=[[SelectFrame alloc]initWithNibName:@"SelectFrame" bundle:nil];
    [[self navigationController] pushViewController:obj animated:YES];
    [obj release];
    

    案例 2:

    UIView *barView=[[UIView alloc]initWithFrame:CGRectMake(0, 500, 200,50)];
    barView.backgroundColor=[UIColor redColor];
    [self.view addSubview:barView];
    [barView release]; 
    

    案例 3:

    NSURLRequest *request = [NSURLRequest requestWithURL:
                         [NSURL URLWithString:@"https://xxxxxxxxxxxxxxxxx"]];
    [[NSURLConnection alloc] initWithRequest:request delegate:self];
    

    这里不需要释放,因为请求对象处于自动释放模式。

    记住两件事。

    1.) 当你retainalloc-init 那个对象时,你必须手动释放一个对象。

    2.) 没有 alloc 方法的类方法返回 autoreleased 对象,因此您不需要释放这些对象。

    使用autorelease的缺点:

    好的,那么autorelease 是什么意思? Autorelease 意味着,不是我们,而是我们的 App 将决定何时释放该对象。假设您的问题的案例2。在barView 添加到self.view 之后,就不需要这个分配的对象了。因此,我们发布它。但是,如果我们将它保持在autorelease 模式,应用程序会保持它更长的时间,仍然保留该对象会浪费部分内存。因此,我们不应该在这里使用自动释放。

    使用autorelease的优势:

    这个过于流行的例子。

    - (NSString*) getText
    {
        NSString* myText = [[NSString alloc] initWithFormat:@"Hello"];
        return myText;
    }
    

    这里,第 3 行导致泄漏,因为我们没有释放分配给 myText 的内存。 因此,

    - (NSString*) getText
    {
        NSString* myText = [[[NSString alloc] initWithFormat:@"Hello"] autorelease];
        return myText;
    }
    

    解决方案

    使用 ARC,忘记 retain release :)

    【讨论】:

    • 感谢您的回答,我还有一个问题,我正在使用 JSON,并且很少有对象在 JSON sdk .m 文件中显示内存泄漏?当我启用 ARC 时,这些文件会显示错误。使用带有 ARC 的 JSON sdk 该怎么做
    • 我不太了解您使用的是什么代码。但是你可以用谷歌搜索这样的东西。 stackoverflow.com/questions/8701780/…
    【解决方案2】:

    如果在 3 种情况下使用 ARC,那么 无需释放任何东西,只要明智地使用(如果需要,分配)

    如果不使用 ARC,则需要释放它

    现在案例1:

    SelectFrame *obj=[[SelectFrame alloc]initWithNibName:@"SelectFrame" bundle:nil];
    [[self navigationController] pushViewController:obj animated:YES];
    [obj release];
    

    案例 2:

    UIView *barView=[[UIView alloc]initWithFrame:CGRectMake(0, 500, 200,50)];
    barView.backgroundColor=[UIColor redColor];
    [self.view addSubview:barView];
    [barView release];
    

    案例 3:

    NSURLRequest *request = [NSURLRequest requestWithURL:
                         [NSURL URLWithString:@"https://xxxxxxxxxxxxxxxxx"]];
    [[[NSURLConnection alloc] initWithRequest:request delegate:self] autorelease];
    

    参考How-to-avoid-memory-leaks-in-iPhone-applications链接。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-05
      • 1970-01-01
      • 1970-01-01
      • 2015-04-25
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多