读书人

NSTimer 和 NSArray 同时使用的有关问

发布时间: 2012-09-18 16:21:42 作者: rapoo

NSTimer 和 NSArray 同时使用的问题

我声明一个全局变量NSArray存放动画所需要各帧图片,然后用NSTimer进行定时动画显示,如下:

  • NSString* globalObject;
  • - (void)applicationDidFinishLaunching:(UIApplication *)application
  • {
  • globalObject = [[NSString alloc] initWithFormat:@"Test"];
  • NSLog(@"Retain count after create: %d", [globalObject retainCount]); // output 1.
  • [globalObject retain];
  • NSLog(@"Retain count after retain: %d", [globalObject retainCount]); // output 2.
  • }
  • - (void)applicationWillTerminate:(UIApplication *)application
  • {
  • NSLog(@"Retain count after Button click runloop finished: %d", [globalObject retainCount]);
  • // 输出1. Button click loop finished, it's autorelease pool released, globalObject get released once.
  • }
  • -(IBAction)onButtonClicked
  • {
  • [globalObject autorelease];
  • NSLog(@"Retain count after autorelease: %d", [globalObject retainCount]);
  • // 输出2。 Autorelease被call, globalObject被加如当前的AutoreleaePool。
  • }
  • [2]为什么需要Auto release ?

    2.1)很多C/C++转过来的程序员会说,这个auto release有什么好,象C/C++那样,自己申请,自己释放,完全可控不好么, 这个auto relase 完全不可控,你都不知到它什么时候会被真正的release。我的理解它有一个作用就是可以做到每个函数对自己申请的对象负责,自己申请,自己释放,该函数的调用者不需要关心它内部申请对象的管理。 在下面这个例子中,Func1的调用者不需要再去关心obj的释放。

    1. ClassA *Func1()
    2. {
    3. ClassA *obj = [[[ClassA alloc]init]autorelease];
    4. return obj;
    5. }

    实际上对于 [NSString stringWithFormat:] 这类构造函数返回的对象都是autorelease的。

    2.2) autorelease pool来避免频繁申请/释放内存(就是pool的作用了)。这个应该是相对比较好理解的。

    总结:1)一定要注意Autorelease pool的生存周期,理解Runloop,避免在对象被释放后使用。

    2)[NSString stringWithFormat:]这类函数返回的对象是不需要再自己release的,它已经被autorelease了, 如果你想把它当一个全局对象使用,那必须自己再retain, 释放时再release。


    读书人网 >移动开发

    热点推荐