--前言:iOS开发中关于对象的释放问题,虽然知道规则,但总不清楚自动释放的对象什么时候彻底消失?它存在的多久?什么情况会消失?都不清楚,每次用自动释放对象,总有点心虚的感觉,以下是一些例子、研究。

--直接上代码,代码写在一个控制器的viewDidLoad方法里(代码内容是用一个path就保存一个data,但path是自动释放对象):

    //例子1
NSArray*patharray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString*docstr=[patharray objectAtIndex:0];
//path成员变量,文件路径-自动释放对象
path=[docstr stringByAppendingPathComponent:@"1.png"];
//data读取内容
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"IMG_1340" ofType:@"PNG"];
NSData *data= [NSData dataWithContentsOfFile:imagePath];
//用path去保存data
[data writeToFile:path atomically:NO];

例子1,这么写,没问题,文件能保存。

    //例子2
NSArray*patharray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString*docstr=[patharray objectAtIndex:0];
//path成员变量,文件路径-自动释放对象
path=[docstr stringByAppendingPathComponent:@"1.png"];
//调用方法,path做参数
[self saveData:path];
//分割线
-(void)saveData:(NSString *)filePath
{
//data读取内容
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"IMG_1340" ofType:@"PNG"];
NSData *data= [NSData dataWithContentsOfFile:imagePath];
//用path去保存data
[data writeToFile:filePath atomically:NO];
}

例子2,这么写,也没问题,文件能保存。或者 [self  saveData:path]; 改成[self saveData];  saveData方法不传入参数,用成员变量path代替filePath的作用,这么写,也没问题。

    //例子3
NSArray*patharray=NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString*docstr=[patharray objectAtIndex:0];
//path成员变量,文件路径-自动释放对象
path=[docstr stringByAppendingPathComponent:@"1.png"]; //创建按钮
UIButton *button = [[UIButton alloc]initWithFrame:CGRectMake(0.0, 0.0, 100, 100)];
button.backgroundColor = [UIColor redColor];
[button addTarget:self action:@selector(saveData) forControlEvents:UIControlEventTouchUpInside];
[self.view addSubview:button];
-(void)saveData
{
//data读取内容
NSString *imagePath = [[NSBundle mainBundle] pathForResource:@"IMG_1340" ofType:@"PNG"];
NSData *data= [NSData dataWithContentsOfFile:imagePath];
//用path去保存data
[data writeToFile:path atomically:NO];
}

例子3,点击button,程序会崩溃,提示“Thread 1:EXC_BAD_ACCESS(code =1, address = 0x0000008)” 。但如果将 path=[docstr stringByAppendingPathComponent:@"1.png"];改成path = [NSString stringWithString:[docstr stringByAppendingPathComponent:@"1.png"]];程序也行,不会崩溃。

--综上看来,“系统返回的自动释放对象”它的存在周期,在一个方法里是有效的(例子1/2),但离开了这个方法,在别的方法,别的地方就不能使用了(例子3),同时“自己创建的自动释放对”比“系统返回的自动释放对象”存在周期长点(例子3改动),但也不是总是存在,有时候用着用着就没了(曾经碰到过,一个自己创建的自动释放的数组,程序运行久了,有时崩溃,就是用着用着该数组没了)。

--总结,如果一个对象你要用,之前retain,用完了就release,这样能确保自动释放对象消息。(例子3中将 path=[docstr stringByAppendingPathComponent:@"1.png"]; 改为path = [NSString stringWithString:[docstr stringByAppendingPathComponent:@"1.png"]] 之后,程序正常运行)

iOS中自动释放问题?的更多相关文章

  1. iOS 之 自动释放池

    向一个对象发送autorelease消息时,cocoa会将该对象的一个引用放入最新的自动释放池.作用域结束时,自动释放池会被释放,池中所有的对象也就被释放了.

  2. iOS中自动登录的设计

    1.//这是登录控制器页面 - (void)viewDidLoad { [super viewDidLoad]; //lt.iSNextAutoLogin是单利中的一个属性,用来保存下次是否自动登录 ...

  3. 自动释放池的前世今生 ---- 深入解析 autoreleasepool

    http://draveness.me/autoreleasepool.html 关注仓库,及时获得更新:iOS-Source-Code-Analyze Follow: Draveness · Git ...

  4. Autorelease自动释放池的使用

    Autorelease自动释放池的使用 使用ARC开发,只是在编译时,编译器会根据代码结构自动添加了retain.release和autorelease. MRC内存管理原则:谁申请,谁释放 遇到al ...

  5. iOS中为网站添加图标到主屏幕

    1 <link rel="apple-touch-icon-precomposed" href="icon.png"/> 2 <link re ...

  6. iOS中为网站添加图标到主屏幕以及增加启动画面

    虽然没有能力开发Native App,但还是可以利用iOS中Safari浏览器的特性小小的折腾一下,做一个伪Web App满足下小小的虚荣心的. 既然是在iOS中的Safari折腾的,那么代码中利用到 ...

  7. 利用iOS中Safari浏览器创建伪Web App

    在safari浏览器里有一个“添加到主屏幕”选项,我们可以用来创建伪Web App,下面来了解一下iOS中Safari的私有属性 第一步设置Web App的主屏幕图标: 有两种属性值apple-tou ...

  8. 刀哥多线程自动释放池autoreleasepool

    自动释放池 作用 自动释放对象的 所有 autorelease 的对象,在出了作用域之后,会被自动添加到最近创建的自动释放池中 自动释放池被销毁或者耗尽时,会向池中所有对象发送 release 消息, ...

  9. NSTimer 销毁问题 和 iOS中控制器的释放问题

    俗话说的好,前人栽树后人乘凉,最近看了很多博文,不少博文提到了NSTimer的销毁问题, 之前我都没怎么注意,现在对照着文章一一实践发现坑还真不少.下面是我读到的几篇博文分享给大家 @啸笑天的NSTi ...

随机推荐

  1. [React] React Router: setRouteWillLeaveHook

    setRouteWillLeaveHook provides a method for us to intercept a route change before leaving the curren ...

  2. 实战:推断mysql中当前用户的连接数-分组筛选

    #connets.sh #!/bin/sh #ocpyang@126.com #依据输入參数u或d来显示出相应的username或数据库名中用户的连接数. #也能够输入u 详细username或d 详 ...

  3. linux服务器内存占用太高-释放内存

    修改/proc/sys/vm/drop_caches,释放Slab占用的cache内存空间(参考drop_caches的官方文档): Writing to this will cause the ke ...

  4. 文件操作2 cp mv rm

    1.cp命令 [root@rusky /]# cp 123 /test  #在linux系统中,如果文件123已经存在,则提示用户确认,在unix系统中则不提示,除非使用参数-i 交互式操作.cp: ...

  5. vmstat

    vmstat(virtual memory statitics)命令是最常见的Linux/Unix监控工具,可以展现给定时间间隔的服务器的状态值,包括服务器的CPU使用率,内存使用,虚拟内存交换情况, ...

  6. 前端bug记录---不定时更新

    在项目的开发中难免遇到各种各样的bug,我觉得还是有必要记录一下的,方便日后查询. safari window resize  为满足日常轮播需求,做一个符合当前业务的轮播插件,其中需要考虑windo ...

  7. hibernate连接数据库,进行操作的步骤

    //初始化 Configuration conf=null; SessionFactory sf=null; Session session=null; Transaction tx=null; tr ...

  8. MVC文件上传 - 使用Request.Files上传多个文件

    控制器 1: using System; 2: using System.Collections.Generic; 3: using System.IO; 4: using System.Linq; ...

  9. (转)jQuery插件开发全解析

    jQuery插件的开发包括两种: 一种是类级别的插件开发,即给jQuery添加新的全局函数,相当于给jQuery类本身添加方法.jQuery的全局函数就是属于jQuery命名空间的函数,另一种是对象级 ...

  10. ref参数的用途

    ref参数 能够将一个变量带入方法进行改变,改变完成后再将改变完成后的变量带出方法 ref参数要求在方法外必须为值赋值,而方法内可以不赋值 static void Main(string[] arr) ...