一、MRC的条件下
①、任何在作用域内创建的”autoreleased”对象(像”fileName”),虽然并没有显示的调用”autorelease”方法,但都将被当前池所管理并释放。
//以下代码运行结果表示,本句验证成功!
//下面的是不开启ARC的代码 下面的代码表明 在pool模块中定义的对象,会自动执行一次autoreleasepool
#import <Foundation/Foundation.h> //关闭了ARC,@autoreleasepool {} 这个依然能运行,效果有什么区别呢?
int main(int argc,constchar * argv[])
{
NSAutoreleasePool *pool =[NSAutoreleasePoolnew];
NSMutableString *mstrX=[NSMutableStringstringWithString:@"hello world"];
NSLog(@"使用带stringWithString初始化的NSMutableString的retainCount值为: %lu",[mstrX retainCount]); //这是1
printf("%s\n",[mstrXUTF8String]);
[pool drain];
printf("%s\n",[mstrXUTF8String]); //这里输出不正常了
NSLog(@"使用带stringWithString初始化的NSMutableString的retainCount值为: %lu",[mstrX retainCount]); //这里输出不正常了输出了一个非常大的一个数
}
②、MRC条件下,在pool语句之外定义的对象,默认不受 [pool drain] 语句的影响。 但若在pool模块中调用了本对象的 autorelease方法,则本对象受到本pool模块的管理!!
//下面两段代码共同说明这个问题:
//下面的是不开启ARC的代码 下面的代码表明 在pool模块外定义的对象,不受pool模块影响
#import <Foundation/Foundation.h> //关闭了ARC,@autoreleasepool {} 这个依然能运行,效果有什么区别呢?
int main(int argc,constchar * argv[])
{
NSMutableString *mstrX=[NSMutableStringstringWithString:@"hello world"];
NSAutoreleasePool *pool =[NSAutoreleasePoolnew];
NSLog(@"使用带stringWithString初始化的NSMutableString的retainCount值为: %lu",[mstrX retainCount]); //这是1
printf("%s\n",[mstrXUTF8String]); //输出 hello world
[pool drain];
printf("%s\n",[mstrXUTF8String]); //输出 hello world
NSLog(@"使用带stringWithString初始化的NSMutableString的retainCount值为: %lu",[mstrX retainCount]); //输出1
}
//下面的是不开启ARC的代码 下面的代码表明 在pool模块外定义的对象,在pool内执行一次autorelease,也可以被本pool模块管理
#import <Foundation/Foundation.h> //关闭了ARC,@autoreleasepool {} 这个依然能运行,效果有什么区别呢?
int main(int argc,constchar * argv[])
{
NSMutableString *mstrX=[NSMutableStringstringWithString:@"hello world"];
NSAutoreleasePool *pool =[NSAutoreleasePoolnew];
NSLog(@"使用带stringWithString初始化的NSMutableString的retainCount值为: %lu",[mstrX retainCount]); //这是1
printf("%s\n",[mstrXUTF8String]); //输出 hello world
[mstrX autorelease];
[pool drain];
printf("%s\n",[mstrXUTF8String]); //输出不正常
NSLog(@"使用带stringWithString初始化的NSMutableString的retainCount值为: %lu",[mstrX retainCount]); //这里输出不正常了输出了一个非常大的一个数
}
③、在MRC模式下,改用@autoreleasepool {... } 这种方式,就不会存在①中的问题了,因为模块内定义的对象在模块外根本使用不了。 如果像②里那样,在模块外定义对象,在模块内使用 对象的autorelease,则在模块结束后,对象执行一次 release操作,如同②中的一样
④、在ARC模式下,不允许调用对象的autorelease、release、retain、retaincount方法,好像是完全不用管内存回收的事情。