天天看点

Objective-C中的内存管理

        在编程语言中是少不了对内存的管理的,内存对于计算机来说是宝贵的资源,所以对使用不到的资源进行回收是很有必要的。oc中使用引用计数和垃圾回收来管理内存,在oc中为每个对象分配一个引用计数器,当对象刚刚被创建时其初始值为1,当有某段代码需要访问一个对象是时,会将该对象的引用计数器加1(通过retain来实现);当访问一个对象结束时,会将该对象的引用计数器减1(通过release来实现);当计数器为0时,该对象占用的内存空间会被收回。在nsobject类有一个retaincount方法,调用该方法可获取当前对象的引用计数值。

        在xcode4以后的版本采取自动引用计数(automatic reference counting)简称arc, 默认的是arc模式,在arc下是不能直接调用retain,release, releasecount等方法的,需要在xcode中进行设置,设置如下: 把objective-c automatic reference counting 改为no,即可。

    ​    ​之前提到的nsoject类里有个方法,retaincount可以获取当前对象的引用计数的值,废话少说上点代码吧。

    ​    ​1. 用可变的数组结合着可变的字符串来观察一下retaincount的变化。

    ​    ​    ​(1).先创建一个可变数组对象,在创建一个可变字符串对象;

    ​    ​    ​(2).然后往可变数组里添加可变的字符串,观察可变字符串的retaincount的变化。

    ​    ​    ​(3).在可变数组中移除一个str,观察retaincount的变化

    ​    ​    ​(4)我们为什么要用可变的字符串呢?稍后会提到为什么。

   ​    ​    运行的结果:

    ​2.nsstring的retaincount的变化

    ​    ​    ​用nsstring声明的字符串变量的retaincount变化由你初始化字符串时的方式决定

    ​    ​    ​1. 用nsstring *str = @"ludashi";定义变量

    ​    ​    ​    ​用上面的方法定义的字符串是常量字符串,他的retiancount为-1或不定,不会随着retian或者release变化而变化

    ​    ​    ​    ​demo如下:

    ​    ​    ​运行结果:

   ​    ​    ​2.使用stringwithformat创建的nsstring为变量,系统会进行引用计数。

    ​    ​    ​demo:

    ​    ​    ​3 .stringwithstring取决于后面跟的string, 后面string的retaincount是多少那么用stringwithstring创建的对象就为多少

    ​    ​    ​    ​demo:

    ​    ​    ​运行结果:

    ​objective-c中得arc(automatic reference counting)

    ​    1.​arc中应注意的问题:

    ​    ​    ​(1). 不能显式调用dealloc语句, 或者实现或调用retain, release, retiancount 和 autorelease等方法。

    ​    ​    ​(2).不能调用@selector (retain) ,@selector (release)等;

    ​    ​    ​(3).不能使用nsautoreleasepool对象, 用@autoreleasepool块来代替;

    ​    ​    ​(4).不能用开头new的名称来定义一个属性,除非你定义一个别的getter名称。

    ​    ​

    ​    ​2.arc特性

    ​    ​    ​arc增加了新的属性定义关键字,strong来代替retain,表示强引用。用weak来代替assign表示弱引用。