0

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

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

- (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)

4

2 回答 2

1

当您使用时@property (nonatomic, retain) MyObject *myObject;@synthesize myObject = _myObject;编译器将为您生成 getter 和 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这就是发生的情况。

在第3行,我们看到这nil与之前设置的对象不同

在第4行,我们释放旧对象

在第5行,我们将支持 ivar 设置为nil. 打电话retainnil无操作的,所以这也很好

于 2012-06-09T15:31:32.170 回答
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;
}
于 2012-06-09T15:21:58.817 回答