IOS之从storyBoard生成的controller对象的生命周期问题

假设在storyBoard中共有两个控制器。 

1.rootViewController :根控制器

 2.testViewController: 测试用的控制器,它的storyBoardID设置为test

根控制器中得代码:

#import "rootViewController.h"
#import "testViewController.h"

@interface test1ViewController ()
{
   testViewController *test; //测试控制器
}
@end

@implementation rootViewController

...

//根控制器添加的按钮方法,点击按钮,就会弹出测试控制器界面
- (IBAction)buttonTapped:(id)sender
{
    //用storyBoard的方法生成对象
    test=[self.storyboard instantiateViewControllerWithIdentifier:@"test1"];

   //动态显示出来
    [self presentViewController:test animated:YES completion:NULL];

    //打印出对象在内存中的地址
    NSLog(@"%p",test);
}

//当测试控制器消失时用于检测test对象是否被系统回收。
- (IBAction)showTestRetainCount:(id)sender
{
  NSLog(@"%d",[test RetainCount]);
}

@end

测试控制器中代码:

@implementation testViewController

//添加一个返回按钮响应方法
- (IBAction)buttonTapped:(id)sender
{
    [self dismissViewControllerAnimated:YES completion:^{
        //当界面消失后打印出自己本身的引用计数,此时该对象虽然不在界面显示,但还没有被系统回收,引用计数不为0
        NSLog(@"%d",[self retainCount]);
    }];
}
@end

结论:

  每次显示出的测试控制器对象的内存地址都不一样,这证明每次都会生成新的对象。

  而当测试控制器消失时,在显示它的引用计数,则程序直接崩溃,证明test对象所占用的内存已被系统回收。

  由此可知:test对象由[self.storyboard instantiateViewControllerWithIdentifier:@"test"]这个方法诞生。

       在[rootViewController presentViewController:test animated:YES completion:NULL];这个方法显示出来。

       最终由[self dismissViewControllerAnimated:YES completion:NULL];这个方法结束生命周期,test对象被系统回收。

时间: 2024-10-17 02:27:30

IOS之从storyBoard生成的controller对象的生命周期问题的相关文章

hibernate中持久化对象的生命周期(三态:自由态,持久态,游离态 之间的转换)

三态的基本概念: 1,  暂时状态(Transient):也叫自由态,仅仅存在于内存中,而在数据库中没有对应数据.用new创建的对象,它没有持久化,没有处于Session中,处于此状态的对象叫暂时对象: 2,  持久化状态(Persistent):与session关联而且在数据库中有对应数据.已经持久化,添?到了Session缓存中.如通过hibernate语句保存的对象.处于此状态的对象叫持久对象: 3,  游离状态(Detached):持久化对象脱离了Session的对象.如Session缓

C++ 匿名对象的生命周期

//匿名对象的生命周期 #define _CRT_SECURE_NO_WARNINGS #include<iostream> using namespace std; class Point{ public: Point(){ cout << "自定义的无参构造函数被调用了1" << endl; } ~Point(){ cout << "自定义的析构函数被调用了2" << endl; } }; void P

hibernate--持久对象的生命周期介绍

持久化对象的状态 : 1. 瞬时对象(Transient Object):使用new操作符初始化的对象不是立刻就持久的.它们的状态是瞬时的,也就是说它们没有任何跟数据库表相关联的行为,只要应用不再引用这些对象(不再被任何其它对象所引用),它们的状态将会丢失,并由垃圾回收机制回收 2. 持久化对象(Persistent Object):持久实例是任何具有数据库标识的实例,它有持久化管理器Session统一管理,持久实例是在事务中进行操作的----它们的状态在事务结束时同数据库进行同步.当事务提交时

六 领域驱动设计-领域对象的生命周期

目录 领域驱动设计-领域对象的生命周期 AGGREGATE FACTORY 领域驱动设计-领域对象的生命周期 每个对象都有生命周期,如图6-1所示.对象自创建后,可能会经历各种不同的状态,直至最终消亡--要么存档,要么删除.当然,很多对象是简单的临时对象,仅通过调用构造函数来创建,用来做一些计算,而后由垃圾收集器回收.这类对象没必要搞得那么复杂.但有些对象具有更长的生命周期,其中一部分时间不是在活动内存中度过的.它们与其他对象具有复杂的相互依赖性.它们会经历一些状态变化,在变化时要遵守一些固定规

Java对象的生命周期与作用域的讨论(转)

导读: Java对象的生命周期大致包括三个阶段:对象的创建,对象的使用,对象的清除.因此,对象的生命周期长度可用如下的表达式表示:T = T1 + T2 +T3.其中T1表示对象的创建时间,T2表示对象的使用时间,而T3则表示其清除时间.由此,我们可以看出,只有T2是真正有效的时间,而T1.T3则是对象本身的开销.下面再看看T1.T3在对象的整个生命周期中所占的比例. 我们知道,Java对象是通过构造函数来创建的,在这一过程中,该构造函数链中的所有构造函数也都会被自动调用.另外,默认情况下,调用

[原创]java WEB学习笔记94:Hibernate学习之路---session 的管理,Session 对象的生命周期与本地线程绑定

本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱好者,互联网技术发烧友 微博:伊直都在0221 QQ:951226918 -----------------------------------------------------------------------------------------------------------------

Java 对象的生命周期

Java对象的生命周期 在Java中,对象的生命周期包含下面几个阶段: 1.      创建阶段(Created) 2.      应用阶段(In Use) 3.      不可见阶段(Invisible) 4.      不可达阶段(Unreachable) 5.      收集阶段(Collected) 6.      终结阶段(Finalized) 7.      对象空间重分配阶段(De-allocated) 图1. JavaObject Life Cycle 1.创建阶段(Create

sqlite3语句对象的生命周期--举例说明

 语句对象的生命周期:  1.使用sqlite3_prepare_v2或相关的函数创建这个对象  2.使用sqlite3_bind_*()给宿主参数绑定值  3.通过调用sqlite3_step一次或多次来执行这个sql  4.使用sqlite3_reset()重置这个语句,然后回到第2步,这个过程做0次或多次  5.使用sqlite3_finalize()销毁这个对象 例子: 1 //查询指定商品 2 - (Product *)selectProductById:(int)proId { 3

hibernate 持久化对象的生命周期

包括三种状态:瞬态(自由态),持久态,托管态(游离态) 自由态 持久化对象的自由态,指的是对象在内存中存在,但是在数据库中并没有数据与其关联. 持久态 持久态指的是持久化对象处于由Hibernate管理的状态,这种状态下持久化对象的变化将会被同步到数据库中. 游离态 处于持久态的对象,在其对应的Session实例关闭后,此时对象进入游离态.也就是说Session实例是持久态对象的宿主环境,一旦宿主环境失效,那么持久态对象迚入游离状态. session.beginTransaction(); Us