iOS内存管理知识点

By | 2017年7月15日

关于ARC,在LLVM编译器中设置ARC为有效状态,就无需再次键入retain或者release代码。

若满足以下条件,就无需手动输入retain和release代码。

  • 使用xcode4.2或以上版本。
  • 使用LLVM编译器3.0或以上版本。
  • 编译器选项中设置ARC为有效。

引入计数

  1. 自己生成的对象,自己所持有
    1. 使用以下命名开头的方法意味着自己生成的对象只有自己持有
      • alloc
      • new
      • copy
      • mutableCopy
    2. copy方法利用基于NSCopying方法约定,由各类实现的copyWithZone: 方法生成并持有对象的副本。与copy方法类似,mutableCopy方法利用基于NSMutableCopying方法约定,由各类实现的mutableCopyWithZone:放阿飞生成并持有对象的副本。两者的区别在于,copy方法生成不可变更的对象,而mutableCopy方法生成可变更的对象。这类似于NSArray类对象与NSMutableArray类对象的差异。用这些方法生成的对象,虽然是对象的副本,但同alloc、new方法一样,在“自己生成并持有对象”这点生并没有改变。
      • 另外,根据上述“使用以下名称开头的方法名”,下列名称也意味着自己生成并持有对象
        • allocMyObject
        • newThatObject
        • copyThis
        • mutableCopyYourObject
  2. 非自己生成的对象,自己也能持有
    • 通过retain方法,非自己生成的对象跟用alloc/new/copy/mutableCopy方法生成并持有的对象一样,成为自己所持有的。
  3. 无法释放非自己持有的对象
  4. alloc/retain/release/dealloc实现
    1. OS X、iOS中的大部分作为开源软件公开在Apple Open Source上。但是包含NSObject类的Foundation框架并没有公开。不过Foundation框架使用的Core Foundation框架的源代码,以及通过调用NSObject类进行内存管理部分的源代码是公开的。但是,没有NSObject类的源代码,就很难理解NSObject类的内部实现细节。为此,我们首先使用开源软件GNUstep来说明。
    2. GNUStep是cocoa框架的互换框架。也就是说,GNUstep的源代码虽不能说与苹果的Cocoa实现完全相同,但是从使用者角度来看,两者行为和实现方式是一样的,或者说非常相似。理解了GNUstep源代码也就相当于理解了苹果的Cocoa实现。

发表评论

电子邮件地址不会被公开。 必填项已用*标注