自己写代码验证MRC和ARC的各种内存回收机制

一、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初始化的NSMutableStringretainCount值为: %lu",[mstrX retainCount]);       //这是1

    printf("%s\n",[mstrXUTF8String]);

    [pool drain];

    printf("%s\n",[mstrXUTF8String]);             //这里输出不正常了

    NSLog(@"使用带stringWithString初始化的NSMutableStringretainCount值为: %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初始化的NSMutableStringretainCount值为: %lu",[mstrX retainCount]);       //这是1

    printf("%s\n",[mstrXUTF8String]);                                                                    //输出 hello world

    [pool drain];

    printf("%s\n",[mstrXUTF8String]);                                                                    //输出 hello world

    NSLog(@"使用带stringWithString初始化的NSMutableStringretainCount值为: %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初始化的NSMutableStringretainCount值为: %lu",[mstrX retainCount]);       //这是1

    printf("%s\n",[mstrXUTF8String]);                                                                    //输出 hello world

    [mstrX autorelease];

    [pool drain];

    printf("%s\n",[mstrXUTF8String]);                                                                    //输出不正常

    NSLog(@"使用带stringWithString初始化的NSMutableStringretainCount值为: %lu",[mstrX retainCount]);       //这里输出不正常了输出了一个非常大的一个数

}

③、在MRC模式下,改用@autoreleasepool {...   } 这种方式,就不会存在①中的问题了,因为模块内定义的对象在模块外根本使用不了。 如果像②里那样,在模块外定义对象,在模块内使用 对象的autorelease,则在模块结束后,对象执行一次 release操作,如同②中的一样


④、在ARC模式下,不允许调用对象的autorelease、release、retain、retaincount方法,好像是完全不用管内存回收的事情。


你可能感兴趣的:(自己写代码验证MRC和ARC的各种内存回收机制)