【问题标题】:Objective C instance variable initialization in a method方法中的Objective C实例变量初始化
【发布时间】:2011-09-24 07:34:29
【问题描述】:

有人遇到过这个问题吗? 如果我需要一个实例变量,而不是作为属性,并在方法中初始化这个变量,那么当我需要它时,它已经被释放了。它发生在自动释放的对象上。这是什么原因?

通常实例变量应该具有类对象的整个生命周期。但是,如果变量是函数的本地变量,并且它是一个自动释放对象,它似乎会在函数退出时被释放。

MyClass.h

@interface MyClass:UIViewController {
  NSDate * date;
}

MyClass.m

@implementation MyClass {

- (void) anInit {
  date = [NSDate date];
}

- (void) useDate {
  NSLog (@"%@", date); 
// here date is already release, and get bad access.
}

}

【问题讨论】:

    标签: iphone objective-c initialization instance-variables


    【解决方案1】:

    你需要retain日期。

    当自动释放池下一次耗尽时,将释放一个自动释放的对象。发生这种情况时与对象的生命周期无关。

    您的实现应该如下所示:

    @implementation MyClass {
    
        - (void) anInit {
          date = [[NSDate date] retain];  // or [[NSDate alloc] init]
        }
    
        - (void) useDate {
          NSLog (@"%@", date); 
        }
    
        - (void) dealloc {
            [date release];
            [super dealloc];
        }
    
    }
    

    【讨论】:

    • 自动释放池不应该检查对对象的引用吗? “日期”是一个类级别的变量,可以被类中的其他方法/函数使用。不是吗?
    • 一个对象不知道有什么其他对象引用了它,自动释放池也没有办法找出来。当它被耗尽时,它所做的只是盲目地减少它所持有的每个对象的引用计数。如果该对象的引用计数达到零,则将其释放,而不管其他对象是否仍然具有对它的引用。
    【解决方案2】:

    [NSDate date]Convenience Constructor 并且是自动释放的,您需要添加一个保留调用。还要确保 anInit 只被调用一次,否则你会造成内存泄漏而不先调用[date release]

    - (void) anInit {
      date = [[NSDate date] retain];
    }
    

    【讨论】:

      猜你喜欢
      • 2010-11-02
      • 1970-01-01
      • 2012-05-27
      • 2016-02-13
      • 1970-01-01
      • 2017-10-23
      • 2010-10-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多