我想知道最安全的方法是释放一个对象并再次重新实例化。
我正在做的是这个似乎有效,但我不确定这是不是会造成内存泄漏?
- (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)
答案 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;
}