【问题标题】:iphone objectiveC alloc/release questioniphone ObjectiveC分配/释放问题
【发布时间】:2010-02-18 08:50:55
【问题描述】:

我是 ObjectiveC 语言的新手。 我无法理解内存管理语法。 我的代码如下:

NSDate* someDate;
someDate=[[NSDate alloc] init];
loop
{ 
   someDate=[[NSDate alloc] init];
}

这里会有内存泄漏吗?还是返回的 NSDate 对象是 [autorelease]?

谢谢

【问题讨论】:

    标签: iphone objective-c memory


    【解决方案1】:

    正如@DavidKanarek 所说,你会有漏洞。

    有很多方法可以修复这些泄漏:

    NSDate* someDate;
    someDate=[NSDate date];
    loop
    { 
       someDate=[NSDate date];
    }
    

    NSDate* someDate=nil;
    someDate=[[NSDate alloc] init];
    loop
    { 
       [someDate release];
       someDate=[[NSDate alloc] init];
    }
    
    [someDate release];
    

    第一个代码更易于阅读,但第二个代码可以尽可能降低内存使用率。如果您的循环不是太大,请使用第一个。如果您要循环数千次,我会使用第二次。

    山姆

    【讨论】:

    • 我什至会争辩在有数千个循环时使用选项一。让系统处理何时释放这些 NSDate 对象,因为它在幕后平衡了性能。循环数千次并在每个阶段释放可能存在循环性能劣势。有兴趣听听您的想法。
    【解决方案2】:

    你会有很多内存泄漏。如果对象由名称中包含 new、alloc 或 copy 的方法返回,则它们最初会被保留(不是自动释放)。 [NSDate date] 将被自动释放。如果您发布更多实质性代码,我可以为您提供一些帮助,帮助您顺利完成目标。

    也可以看看Apple's Memory Management Guide

    【讨论】:

    • 所以和alloc无关?
    • 我认为他的意思是名称中包含 alloc、new 或 copy 的方法。
    • 大卫......谢谢......这里有更多细节。我的代码的要点是在循环中用“当前日期”更新“someDate”变量。
    • @DavidKanarek - alloc 导致保留计数设置为 1,而不是 init。
    • @luliu 我会使用someDate=[NSDate date] 并分析您的应用程序以确保内存使用是可以接受的。
    【解决方案3】:

    此对象所有权方案是通过引用计数系统实现的,该系统在内部跟踪每个对象有多少所有者。当你声明一个对象的所有权时,你增加了它的引用计数,当你完成了这个对象时,你减少了它的引用计数。当它的引用计数大于零时,保证一个对象存在,但是一旦计数达到零,操作系统就被允许销毁它。

    http://rypress.com/tutorials/objective-c/memory-management

    但在最新的 xcode 中,它提供了 ARC(自动引用计数)。
    所以它会自动管理引用计数。当类被释放时,它会为它所包含的所有对象释放内存。

    【讨论】:

      【解决方案4】:

      你会有很多内存泄漏。

      someDate 是一个 poninter 变量,并分配了一块您分配的内存,在本例中为 [[NSDate alloc] init]

      但是,在循环中,您将指针变量分配给另一个内存块 (someDate=[NSDate date])

      内存泄漏是因为那些已经分配的内存块没有释放。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-10-03
        • 1970-01-01
        • 1970-01-01
        • 2011-05-01
        相关资源
        最近更新 更多