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



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

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

- (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;
}

最新更新