iphone objectiveC alloc / release问题

时间:2010-02-18 08:50:55

标签: iphone objective-c memory

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

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

我会在这里发生内存泄漏吗?或者返回的NSDate对象是[autorelease]?

由于

4 个答案:

答案 0 :(得分:5)

正如@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];

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

萨姆

答案 1 :(得分:4)

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

另请查看Apple's Memory Management Guide

答案 2 :(得分:1)

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

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

但是在最新的xcode中,它提供了ARC(自动引用计数) 因此它将自动管理引用计数。当类被释放时,它释放内容中的所有对象的内存。

答案 3 :(得分:0)

你会有很多内存泄漏。

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

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

由于已分配的内存块未释放,因此发生内存泄漏。