【问题标题】:Re-instantiate an object and memory leaks重新实例化对象和内存泄漏
【发布时间】:2012-06-09 15:05:47
【问题描述】:

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

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

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

【问题讨论】:

  • 是什么让您认为它可能导致内存泄漏? ...这很好
  • 因为我认为你必须使用'release'关键字才能真正从内存中释放一个对象,就像在dealloc中发生的那样。
  • 在 Instruments 中运行它,看看它是否会造成泄漏。
  • @Oysio 如果您使用@synthesize@propertyretain,编译器会将正确的内存管理放在合成的getter 和setter 中。在这种情况下,setter 将正确释放旧值并将 ivar 设置为 nil
  • 这可能会有所帮助:stackoverflow.com/questions/6091394/…

标签: iphone objective-c memory-leaks


【解决方案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 的示例中,会发生这种情况。

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

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

在第 5 行,我们将支持 ivar 设置为 nil。在nil 上调用retain 是无操作的,所以也可以

【讨论】:

    【解决方案2】:

    这些行在您的代码中是多余的。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-03-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-10-31
      • 1970-01-01
      • 2015-09-28
      相关资源
      最近更新 更多