OC(七)内存管理

一.ios的app使用的内存超过30M,则系统会向改app发送Memory Warning消息,收到消息,他必须正确处理,负责可能出现内存泄露甚至崩溃。 

 对象是要占用内存的,如果创建了对象(分配了内存)而不去释放这些对象所占用的内存,将会发生内存泄露。

 需要手动去管理内存。

 管理内存:

 1.分配内存

 2.释放内存

 在不需要这个对象的时候,及时把这个对象释放掉,就可以防止内存泄露(只分配,不释放)。

 不知道怎么去判断是否需要释放一个对象

 引用计数:是判断一个对象是否存在的一个标准

 得到引用计数公式:对象名.retainCount


 什么样的数据需要咱们手动管理内存?

 基本数据类型(不能称之为对象,不具备对象的属性特征,只是一个单一的数据)不需要咱们手动管理内存,它由系统处理    ->栈

 除了基本数据类型,都需要手动管理内存(需要程序员管理) ->堆


 程序员开辟的内存,属于分配到堆里,系统自动分配的内存会到栈里。

person *p = [[person alloc]init]; 堆

int a = 10; 栈


 谁分配谁释放

retainCount 引用计数>0的时候,就是对象存在的时候,如果不大于0,就表示这个对象已经被释放了.    

 二. 生命周期

 1.alloc之后对象就存在了

 2.具体对对象的操作

 3.释放对象


 引用计数的操作:

 引用计数是判断一个对象是否存在的一个标准(>0)

 *******重要********

 让引用计数+1的方法:

 ①.alloc、new

 ②.retain 保留引用计数

 ③.copy

 让引用计数-1的方法:

 ①.release 释放

 ②.autorelease 延迟释放


 对象被释放的时候会调用一个销毁对象的方法--delloc->销毁对象


 有一个alloc、retain、copy就要有一个对应的release,才能释放掉对象。


 MRC:手动管理引用计数

 ARC:自动管理引用计数






 setter方法的内存管理

 - (void)dealloc{

 [super delloc];

 [原来的变量(全局变量) release];

 }


 - (void)set对象名:(类型)参数名{

 if (原来的变量 != 参数名){

 [原来的变量 release];

 原来的变量 = [参数名 retain];

 }

 }


 内存管理的原则:谁分配谁释放

 有一个alloc retain copy 就要有对应的release autorelease


 引用技数:retaincount

 引用计数+1:alloc retain copy

 引用计数-1:release autorelease


copy 会产生一个新的对象,新的对象引用计数+1,跟原来对象没有关系

 如果释放了原来的对象,新的对象依然存在


retain 保留引用计数,给原来对象引用计数+1,只要有一个引用计数为0,这个对象就会被销毁掉。




 autorelease:延迟释放 等到需要释放时才去释放,也会引用计数-1

 常与自动释放池配合使用 

 自动释放池:在自动释放池里面的对象,只要使用了outorelease 在出池的时候就会被统一释放掉

 自动释放池的两种写法:

 1、@autoreleasepool {

 花括号内表示在自动释放池内

 }出了花括号就表示出池(所有使用autorelease的对象全部会被释放掉)



 2、NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

 只要在自动释放池对象release之前都算池内


 [pool release];


 属性的ARC关键字的声明


 属性手动管理引用计数:


 ARC:自动管理引用计数


 MRC:手动管理引用计数

//自动释放池的生命周期

 //当对象在自动释放池被创建,并使用auyorelease

 //对象会在自动释放池出池的时候,被自动释放池统一调用池内全部的autorelease 释放全部对象

 //可以使用在循环创建一些对象的时候,不知道什么时候创建使用完毕,可以选择使用自动释放池

 @autoreleasepool {

//        Person *laoWang = [[[Person alloc]init]autorelease];


 /*     Person *person = [[Person alloc]init];

//        Person *person = [Person new];

        [person retain];

//retain 给同一对象保留引用计数

        //目的 为了保证一个不会被释放掉,给这个对象引用计数+1


        Person *ppp = [person retain];

        NSLog(@"%ld",ppp.retainCount);

        [person release];

        NSLog(@"%ld",person.retainCount);

        //打印结果:内存管理[1263:49394] 2

        //打印结果:内存管理[1263:49394] 1

        [person release];

        //打印结果:对象已经被销毁

        //如果一个对象被释放掉 这个对象就是野指针(指针跟对象都存在着,但是联系不起来了),为了防止使用野指针可以在这个对象释放之后,同时给这个对象赋值为空(nil)

        person = nil;

        */

//        

//        Person *person = [[Person alloc]init];

//        Person *pp = [person retain];

//        [person release];

//        [pp release];

//        Weapon *qiang = [[Weapon alloc]init];

//        Person *huluiwa = [[Person alloc]init];

//        [huluiwa setWeapon:qiang];

//        [qiang release];

 //如果现在释放qiang  huluwa这个对象还在使用 就得想办法让qiang不被销毁

 //方法:+1,在setWeapon这个方法中

 //在dealloc方法中销毁qiang

//        NSLog(@"%@",huluiwa.weapon);

//        [huluiwa release];


//        NSArray *list = [[NSArray alloc]initWithObjects:@"1111", nil];

//        NSArray *list2 = [list copy];

//        //nil 存在的对象也可以置空

//        [list release],list = nil;

//        NSLog(@"%@",list2);

//        [list2 release];





 NSMutableArray *list = [NSMutableArray array];

 //作用域不放入自动释放池

 /*     @autoreleasepool {

            for (int i=0; i<10; i++) {

                Person *p = [[[Person alloc]init]autorelease];

                [list addObject:p];

            }

        }*/

 NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init];

 for (int i=0; i<10; i++) {

 Person *p = [[[Person alloc]init]autorelease];

[list addObject:p];

        }



[pool release];




------.h----------

{

 Weapon *_weapon;

}


-(void)setWeapon:(Weapon *)weapon;

-(Weapon *)weapon;

//在字符串、数组、字典、为属性的一般都是用copy

//其他对象都是使用retain

@property (nonatomic,copy)NSString*name;

//基本数据类型使用assign(直接赋值)

//属性其他关键字

//1.只读:readonly只允许访问 不允许修改(只允许使用getter方法)

//2.读写:readwrite

//3.getter=isSuccess 表示在赋值的时候,这个属性叫做success 在取值的时候叫做isSuccess




//1.retain:只要使用属性 除了基本数据类型 都可以使用retain

//2.copy:在字符串、数组、字典、为属性的一般都是用copy

//是为了防止赋值的数组被释放置空,影响属性的数组,生成一个新的数组

//3、assign 是直接赋值 只要是基本数据都是用assign


//设置属性的访问权限

//readwrite:开放属性的全部权限

//readonly:只开放读取的权限(保护对象里面的数据不被修改)


//ARC:

//1.strong强壮的 不会被释放调用<告诉系统这个属性是不能被释放的>

//2.unsafe_unretained 允许在特殊情况下释放掉,不安全的

-------------.m----------

//重写(父类方法子类再写一次)

//优先调用子类重写父类的方法

//如果子类还想实现父类同样的功能


- (void)dealloc

{

 //具体销毁对象的内容

 //当引用计数为0的时候会自动调用这个方法

 //当人被销毁的时候也就是不再需要武器的时候,就可以销毁

    [_weapon release],_weapon = nil;

 NSLog(@"对象已经被销毁");

    [super dealloc];

}


-(void)setWeapon:(Weapon *)weapon{

 //咱们可以确定 person这个对象什么时候被销毁

 //可以在销毁这个对象的同时销毁武器

 if (_weapon != weapon) {

 _weapon = [weapon retain];

    }

}

-(Weapon *)weapon{

 return _weapon;

}

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,761评论 5 460
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,953评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,998评论 0 320
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,248评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,130评论 4 356
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,145评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,550评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,236评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,510评论 1 291
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,601评论 2 310
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,376评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,247评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,613评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,911评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,191评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,532评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,739评论 2 335

推荐阅读更多精彩内容

  • 内存管理 简述OC中内存管理机制。与retain配对使用的方法是dealloc还是release,为什么?需要与a...
    丶逐渐阅读 1,928评论 1 16
  • 内存管理ARC处理原理ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只...
    X先生_未知数的X阅读 313评论 0 3
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,248评论 8 265
  • 内存管理ARC处理原理ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只...
    X先生_未知数的X阅读 482评论 1 3
  • 好像在一起了一样... 你在想什么 可能我想的都能实现... 真是太吓人了... 因为字里行间的都能被他发觉......
    ShAvIn阅读 281评论 0 0