我想知道释放对象并再次重新实例化最安全的方法是什么。
我正在做的是这个,它似乎有效,但我不确定这是否没有产生内存泄漏?
- (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)
当您使用 @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
的例子中,这就是发生的事情。
在第 3 行,我们看到nil
与之前设置的对象不同
在第 4 行,我们释放旧对象
在第 5 行,我们将后备 ivar 设置为 nil
。在nil
上呼叫retain
是无操作的,所以这也很好
这些行在你的代码中是额外的。
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;
}