内存管理 ios

用alloc,new,copy和mutableCopy创建的对象必须自己释放,其他对象都可以当成是引用计数为1且位于自动回收池中。

1. NSString *second = [[NSString alloc] init]; //second的引用计数为1

    [someStringArray addObject: second]; //2 。被插入数组中,数组回自动持有加入其中对象。//需要一次release
 
2. NSString *sixth = [NSString stringWithString:@"Toughie"]; //1
    NSArray *anotherArray = [NSArray arrayWithObjects: sixth count:1]; //2
    NSDictionary *newDictionary = [NSDictionary dictionaryWithObjects:sixth forKeys: @"toughie"     count:1]; //3
    NSString *ignoreMe = [sixth retain]; //4.最后需要一次release,对应retain
 
 

管理对象图以避免内存泄漏:

对象之间的引用还有强弱之分,默认情况下,Objective-C 中的引用是强引用。这通常是件好事,但是,一不小心,对象之间的强引用会形成一个不能断开的引用链,如图,如果断开 A 和 B 之间的引用,则包含 B、C、D 和 E 的子图形将“永远”存在。对强引用循环的解决之道,在于明智地使用弱引用,一个对象未被强引用时,该对象将被释放,对该对象的所有弱引用都会设定为 nil。对于变量(全局、实例和局部),在变量名称前面使用 __weak 限定符,以将引用标记为弱。

 

  • 委托

    @property(weak) id delegate;

    将在“设计模式”文章“采用设计模式使您的应用程序合理化”中了解有关委托和目标的信息。

  • 未引用顶级对象的 Outlet

    @property(weak) IBOutlet NSString *theName;

    Outlet 是对象之间的连接(或引用),归档在串联图或 nib 文件中,且在应用程序载入该串联图或 nib 文件时得到恢复。串联图或 nib 文件中顶级对象(通常是窗口、视图、视图控制器或其他控制器)的 outlet 应该为 strong(默认值,因此无标记)。

  • 目标

    (void)setTarget:(id __weak)target
  • 在块内对 self 的引用

    __block typeof(self) tmpSelf = self;
    [self methodThatTakesABlock:^ {
        [tmpSelf doSomething];
    }];

    一个块对它所捕捉的变量构成强引用。如果在块内使用 self,该块对 self 构成强引用。因此,如果 self 也具有对该块的强引用(通常都有),将产生强引用循环。要避免循环,您需要在块外创建对 self 的 weak(或 __block)引用,如以上例子所示。

posted on 2013-08-23 15:26  (@_@)~  阅读(116)  评论(0编辑  收藏  举报