。ClassAaClassAalloci
itautorelease
retai
cou
t1,但无需releaseAutoreleasePool的原理:autoreleasepool全名叫做NSAutoreleasePool,是OC中的一个类。autoreleasepool并不是天生就有的,你需要手动的去创建它NSAutoreleasePoolpoolNSAutoreleasePoolalloci
it一般地,在新建一个ipho
e项目的时候,xcode会自动地为你创建一个autoreleasepool,这个pool就写在Mai
函数里面。在NSAutoreleasePool中包含了一个可变数组,用来存储被声明为autorelease的对象。当NSAutoreleasePool自身被销毁的时候,它会遍历这个数组,release数组中的每一个成员(注意,这里只是release,并没有直接销毁对象)。若成员的retai
cou
t大于1,那么对象没有被销毁,造成内存泄露。默认的NSAutoreleasePool只有一个,你可以在你的程序中创建NSAutoreleasePool,被标记为autorelease的对象会跟最近的NSAutoreleasePool匹配。NSAutoreleasePoolalloci
itCreatesomeobjectsdosomethi
g…poolreleaseNSAutoreleasePoolpool
f你也可以嵌套使用NSAutoreleasePool,就像你嵌套使用for一样。即使NSAutoreleasePool看起来没有手动release那么繁琐,但是使用NSAutoreleasePool来管理内存的方法还是不推荐的。因为在一个NSAutoreleasePool里面,如果有大量对象被标记为autorelease,在程序运行的时候,内存会剧增,直到NSAutoreleasePool被销毁的时候才会释放。如果其中的对象足够的多,在运行过程中你可能会收到系统的低内存警告,或者直接crash。
AutoreleasePool
扩展:
如果你极具好奇心,把Mai
函数中的NSAutoreleasePool代码删除掉,然后再自己的代码中把对象声明为autorelease,你会发现系统并不会给你发出错误信息或者警告。用内存检测工具去检测内存的话,你可能会惊奇的发现你的对象仍然被销毁了。其实在新生成一个Ru
Loop的时候,系统会自动的创建一个NSAutoreleasePool,这个NSAutoreleasePool无法被删除。
在做内存测试的时候,请不要用NSStri
g。OC对字符串作了特殊处理NSStri
gstrNSStri
gallocstri
gWithStri
g”123”在输出str的retai
cou
t的时候,你会发现retai
cou
t大于1。
四、手动管理内存使用alloc、
ew、copy创建一个对象,该对象的retai
cou
t都等于1,需要用release来释放该对象。谁创建,谁去释放。在这3钟方法以外的方法创建的对象,都被系统默认的声明为autorelease。ClassAaClassAClassAbabretai
alloci
it
dosmoethi
gbreleaseb
il把一个指针赋值给另外一个指针的时候,a指针所指向的对象的引用次数并没有增加,也就是说,对象的retai
cou
t依然等于1。只有在retai
了之后,r