用同样的检索条件从context检索出的对象是一个????所以 在主页的3个brand没法释放,在仅仅处理brand的时候????

和 多个 context无关


我重写了NSManagedObject 子类的 的 dealloc 方法,让它在释放时,输出log,这样就能检测它的释放情况了。

先看一个简单的情况,局部变量里用 insertNewObjectForEntityForName 方法插入一个对象,不保存context。代码如下:

 TestFile *file = [NSEntityDescription insertNewObjectForEntityForName:@"TestFile" inManagedObjectContext:[[DBManager sharedManager] managedObjectContext]];

没有log输出,说明没有释放。 之后保存context,释放的log输出了。我又测试了函数完成后2秒后再进行save context,结果log输出就变成了2秒后。

之后我又把这个变量写成全局变量,代码如下:

file = [NSEntityDescription insertNewObjectForEntityForName:@"TestFile" inManagedObjectContext:[[DBManager sharedManager] managedObjectContext]];

这次立即保存context也没有输出log。

从上面这2个测试可以看出,NSManagedObject 也是遵守 oc 的释放规则的:有强引用就不释放。有些特殊的地方是:当建立一个局部变量时,如果这个变量还没被保存,那么context会自动进行强引用,防止数据丢失,这样就出现了 即使是局部变量,对象的生命周期也没有在函数结束后就结束!


测完insert,再测测查询。

先看简单的查询:

 HubFile *file = [HubFileDAO retrieveHubFilesByFileID:[NSNumber numberWithInt:]];

函数结束后,立即输出了释放log。换成全局变量后,没有log输出了。

再看update,代码如下:

 HubFile *file = [HubFileDAO retrieveHubFilesByFileID:[NSNumber numberWithInt:]];

 file.shownName = @"aaaaaa";

函数结束后,没有log输出。就像insert时的情况一样了,context 必须保存后才能释放对象。

由此进一步总结一下,对于一个NSManagedObject对象,如果它有任何新内容没有被context保存,那么对应的context就会对它进行强引用,直到我们对context 进行保存。


再看下面代码

同样的检索条件检索出的对象的地址是一致的!不要把他们当做2个对象!有特殊情况存在,见下面的测试!


再看以下代码:

  HubFile *file1 = [HubFileDAO retrieveHubFilesByFileID:[NSNumber numberWithInt:]];

    [[DBManager sharedManager].managedObjectContext reset];

    NSLog(@"file name is %@",file1.shownName);

输出是 file name is (null)。

由于掉用了reset,NSManagedObject 的数据部分变成了 fault(可以理解为无效的)。虽然这时的file1指针仍然指向NSManagedObject对象,但是对所有data属性都变成了nil。

再看以下代码:

    HubFile *file1 = [HubFileDAO retrieveHubFilesByFileID:[NSNumber numberWithInt:]];

    [[DBManager sharedManager].managedObjectContext reset];

    HubFile *file2 = [HubFileDAO retrieveHubFilesByFileID:[NSNumber numberWithInt:]];

    NSLog(@"file1 name is %@",file1.shownName);
NSLog(@"file2 name is %@",file2.shownName);

输出是

file1 name is (null)

 file2 name is aaaa

看看NSLog(@"file2 name is %@",file2.shownName);调用后的内存情况:

虽然检索条件相同,但是由于在中间掉用了reset函数,file1和file2指向了不同的地址。可以看出,在context reset后,所有之前查询到的指针都失去了作用,虽然它们的地址不是空,但是无法对任何数据属性进行访问了。再次查询也不会在原来的地址上进行内存分配,而是重新分配了一块内存。简单地说,调用 reset 后 ,就不该使用以前的旧对象引用了!


再看由于使用 relationship 产生的 retain circle

   HubBrand *oldBrand = [HubBrandDAO retrieveHubBrandByModelID:@""];
oldBrand.shownName = @"aaaa";
[[DBManager sharedManager] saveContext];

brand对象可以释放。

   HubBrand *oldBrand = [HubBrandDAO retrieveHubBrandByModelID:@""];
oldBrand.shownName = @"aaaa";
oldBrand.iconFile.shownName = @"tttttt";
[[DBManager sharedManager] saveContext];

brand 对象无法释放,这里iconFile是一个一对一的relationship,关联一个File对象。

这里有一个解释:http://stackoverflow.com/questions/1789974/core-data-and-retain-cycles

When you have relationships between managed objects, each object maintains a strong reference to the object or objects to which it is related. In a managed memory environment, this causes retain cycles (see Object Ownership and Disposal) that can prevent deallocation of unwanted objects. To ensure that retain cycles are broken, when you're finished with an object you can use the managed object context method refreshObject:mergeChanges: to turn it into a fault.

根据说明,我们再试试下面代码:

 HubBrand *oldBrand = [HubBrandDAO retrieveHubBrandByModelID:@""];
oldBrand.shownName = @"aaaa";
oldBrand.iconFile.shownName = @"tttttt"; //必须在save之后调用,不然无法达到打破retain circle的作用!
//[[DBManager sharedManager].managedObjectContext refreshObject:oldBrand mergeChanges:YES]; [[DBManager sharedManager] saveContext]; [[DBManager sharedManager].managedObjectContext refreshObject:oldBrand mergeChanges:YES];

brand 和 file 对象都被正确释放了!

ios CoreData NSManagedObject 生命周期的更多相关文章

  1. (转)iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    原文:http://blog.csdn.net/totogo2010/article/details/8048652 iOS应用程序生命周期(前后台切换,应用的各种状态)详解         分类:  ...

  2. iOS对UIViewController生命周期和属性方法的解析

    目录[-] iOS对UIViewController生命周期和属性方法的解析 一.引言 二.UIViewController的生命周期 三.从storyBoard加载UIViewController实 ...

  3. 转:iOS应用程序生命周期(前后台切换,应用的各种状态)详解

    iOS应用程序生命周期(前后台切换,应用的各种状态)详解 分类: iOS开发进阶2012-10-08 15:35 42691人阅读 评论(30) 收藏 举报 iosapplication任务anima ...

  4. 【iOS开发】iOS对UIViewController生命周期和属性方法的解析

    iOS对UIViewController生命周期和属性方法的解析 一.引言 作为MVC设计模式中的C,Controller一直扮演着项目开发中最重要的角色,它是视图和数据的桥梁,通过它的管理,将数据有 ...

  5. iOS - ViewController的生命周期

    iOS SDK中提供很多原生的ViewController,大大提高了我们的开发效率:那么下面我们就根据开发中我们常用的ViewController谈一谈它的生命周期: (一)按照结构和用法可以对iO ...

  6. iOS 应用程序生命周期

    开发应用程序都要了解其生命周期. 今天我们接触一下iOS应用程序的生命周期, iOS的入口在main.m文件: int main(int argc, char * argv[]) { @autorel ...

  7. iOS中的生命周期

    对于一个iOS app来讲,生命周期是一个十分至关重要的东西.对于一个app来讲控制着app的开启.睡眠.关闭等状态:对于一个页面的来讲,控制页面的加载.显示.消失:对于一个View或者一个普通的类来 ...

  8. 2. iOS程序的生命周期

    程序启动-生命周期 来自:  QQ: 853740091 1.首先讲解UIApplication对象 (1)UIApplication对象是应用程序的象征,一个UIApplication对象就代表一个 ...

  9. iOS控制器的生命周期分析和使用

    转自http://blog.csdn.net/qijianli/article/details/7826979 iOS的SDK中提供很多原生ViewController,大大提高了我们的开发效率,下面 ...

随机推荐

  1. 用HTML/JS/PHP方式实现页面延时跳转

    WEB开发中经常会遇到页面跳转或延时跳转的需求,掌握各种页面跳转方式非常必要. 以下是我总结有用HTML/JS/PHP三类方式实现跳转的方法,例子皆为三秒后跳转到index.php 页面. 1,HTM ...

  2. mysql 简单练习

    1.查找全部学生的信息 [SQL]select * from student 受影响的行: 0 时间: 0.000s 2.查出成绩及格的所有人 [SQL]select * from student w ...

  3. webapp中的meta

    <!--开发后删除--> <meta http-equiv="Pragma" name="no-store" /><!--必须联网 ...

  4. AngularJS API之bootstrap启动

    对于一般的使用者来说,AngularJS的ng-app都是手动绑定到某个dom元素.但是在一些应用中,这样就显得很不方便了. 绑定初始化 通过绑定来进行angular的初始化,会把js代码侵入到htm ...

  5. iOS: ARC & MRC下string内存管理策略探究

    ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作 ...

  6. 2015Summer Training #2

    暑假集训昨天刚开始,14级的小伙伴快到齐了,hhhhh ,毕竟下学期区域赛,对我们来说还是很困难的. 打算每天写份总结. UVA 11300 C.Spreading the Wealth 题目大意:n ...

  7. Hadoop 面试题 之Hive

    1.Hive 有哪些方式保存元数据,各有哪些特点. 15. Hive内部表和外部表的区别 23.hive底层与数据库交互原理Hive的Hql语句掌握情况? 36.使用Hive或自定义mr实现如下逻辑: ...

  8. webpack 教程 那些事儿05-多页应用

    本篇主要关于如何用webpack构建多页应用 为什么要构建多页应用呢?因为我的项目本来就是多页应用啊至于为什么要用webpack?因为我要用vue啊,嫌gulp 每次打包慢 啊 文章目录 1. 利用v ...

  9. PHPCMS几个有用的全局函数

    1.$site_setting = get_site_setting($siteid);   这个get_site_setting()函数读取的是多站点中$siteid站点的相关配置,具体位置在网站根 ...

  10. HDU 4791 Alice's Print Service(2013长沙区域赛现场赛A题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4791 解题报告:打印店提供打印纸张服务,需要收取费用,输入格式是s1 p1 s2 p2 s3 p3.. ...