重新实例化对象和内存泄漏

时间:2012-06-09 15:05:47

标签: iphone objective-c memory-leaks

我想知道最安全的方法是释放一个对象并再次重新实例化。

我正在做的是这个似乎有效,但我不确定这是不是会造成内存泄漏?

- (void)reLoadCalendarObject
{
if (self.calViewController != nil)
    self.calViewController = nil;   //release instantiated object

CalViewController *tempCalViewController = [[CalViewController alloc]initWithDate:[NSDate dateWithTimeIntervalSinceNow:0.0f] observer:self];
self.calViewController = tempCalViewController;
[tempCalViewController release];
self.calViewController.dataSource = self.calendarDataSource;
}

self.calViewController属性声明为(nonatomic,retain)

2 个答案:

答案 0 :(得分:1)

当您使用@property (nonatomic, retain) MyObject *myObject;@synthesize myObject = _myObject;时,编译器将为您生成getter和setter。 setter将表现(不一定像这样实现)这样的事情

1| - (void)setMyObject:(MyObject *)myObject;
2| {
3|     if (_myObject != myObject) {
4|         [_myObject release];
5|         _myObject = [myObject retain];
6|     }
7| }

3 行,我们检查以确保您设置的对象与传入的对象不同(我们检查指针,因为我们正在检查它是完全相同的对象)

4 行,我们知道我们有不同的对象,所以我们需要释放旧值

5 行,我们对新对象进行保留


正如@thesaad指出你的self.calViewController = nil;是超级的,所以实际上是if (self.calViewController 1= nil),因为如果属性是nil(或任何对象),那么发送nil(或任何对象)是绝对安全的已经设定。

在您传递nil的示例中,这就是发生的事情。

3 行,我们看到nil与先前设置的对象不同

4 行,我们释放旧对象

5 行,我们将支持ivar设置为retain。在nil上拨打{{1}}是一个无操作,所以也很好

答案 1 :(得分:0)

这些行在您的代码中是额外的。

if (self.calViewController != nil)
    self.calViewController = nil;   //release instantiated object

当你创建一个属性时,内存管理进入编译器结束。以及你重新实例化它的方式是完美的。所以代码将会喜欢这个

- (void)reLoadCalendarObject
{


CalViewController *tempCalViewController = [[CalViewController alloc]initWithDate:[NSDate dateWithTimeIntervalSinceNow:0.0f] observer:self];
self.calViewController = tempCalViewController;
[tempCalViewController release];
self.calViewController.dataSource = self.calendarDataSource;
}