内存管理(一)

来源:互联网 发布:侠客风云传官网优化 编辑:程序博客网 时间:2024/05/15 04:34
////  main.m//  8_11_oc内存管理////  Created by lanou3g on 15/8/11.//  Copyright (c) 2015年 lanou3g. All rights reserved.//#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) {    @autoreleasepool {        //将整型数10 保存在变量a中。        int a = 10;        //下面这句话,先执行右边的,现在堆内存中开辟一段存储空间,存储创建好的Person对象,对象的空间地址储存在p1中。        //p1指向创建的Person对象        //通常:将指向某个对象的指针,代指为对象        Person *p1 = [[Person alloc]init];        Person *p2 = p1;        //p3就是指针,没有指向任何对象。,nil相当于null,只能给指针赋值。        //在oc中,对nil做任何操作,都相当于空操作,但不会崩溃        //在C语言中操作空指针,会会崩溃。        Person *p3 = nil;        p3.name = @"hahha";        NSLog(@"%@",p3.name);        Person *p4 = [[Person alloc]init];        Person *p5 = [[Person alloc]init];        NSArray *arr = [NSArray arrayWithObjects:p1,p2,p4,p5, nil];        //从数组中取出第二个元素        Person *p = arr[2];        NSLog(@"%@  %@",p,p4);#pragma mark-------------内存管理        //mac支持gc(垃圾回收),iphone不支持gc。语言是支持垃圾回收的。        //内存管理机制,引用计数        //多个指针可以指向同一个对象        //为了避免出现野指针,需要使用对象时要计数,不使用对象时,要对计数减一。        //alloc        Person *p6 = [[Person alloc]init];        NSLog(@"%lu",[p6 retainCount]);        //retain, 引用计数加一,不关心原始数据;        [p6 retain];        NSLog(@"%lu",[p6 retainCount]);        //此时p7指向p6,引用计数没有变化        Person *p7 = p6;        NSLog(@"%lu",[p7 retainCount]);        //p6指向的Person对象,引用计数加1,p8指向了p7,p6指向的对象        Person *p8 = [p6 retain];        NSLog(@"%lu",[p8 retainCount]);        //调用release,实现引用计数减1        [p7 release];        NSLog(@"%lu",[p8 retainCount]);        [p8 release];        NSLog(@"%lu",[p8 retainCount]);        //当你的引用计数应该减为0时,对象自动销毁,存储空间被回收。        //但是打印永远为1;   因为内部有一个判断,        [p8 release];        NSLog(@"%lu",[p8 retainCount]);        //应该为0,但打印为0;        //现在就不能再使用创建的对象,因为已经被销毁了。        //retainCount 的作用,观察引用计数的变化.增加减少的变化。只看变化,不看结果。        Person *pe1 = [[Person alloc]init];        [pe1 retain]; //2        [pe1 autorelease]; //        [NSThread sleepForTimeInterval:3];        NSLog(@"%lu",[pe1 retainCount]);/* //release的内部实现应该如下 -(void)release {    if(self.retainCount>1)    {        self.retainCount--;    }    if(self.retainCount==1)    {        [self dealloc];        retainCount = 1;    } } */        /*         1、内存管理原因:         (1)内存溢出   内存不够用         (2)野指针异常   指针操作了不属于自己的存储空间,指针操作已经销毁的对象         2、内存管理的方式         (1)垃圾回收  OC支持,mac开发支持,iOS开发不支持         (2)mrc  iOS开发  手动操作引用计数,手动调用控制引用计数的方法         (3)arc  iOS开发  自动操作引用计数,编译器调用引用计数的方法         3、内存管理的机制         (1)引用计数   标记程序运行期间,对象被引用的次数         (2)通过操作引用计数,控制对象是否被销毁。         (3)当引用计数应该减为0时,对象自动被销毁,存储空间被回收         4、操作引用计数的方法         (1)造成引用计数增加         alloc   当前对象  0 -> 1         retain  当前对象  加1         copy    原来的对象 不变   新的对象  0 -> 1         (2)造成引用计数减少         release  当前对象  立即减1         autorelease   当前对象  延迟减1  非立即         5、销毁对象         dealloc  引用计数将要减为0时,对象自动调用         (1)继承自NSObject,可以不实现,编译器默认实现         (2)如果实现dealloc方法         - (void)dealloc         {         代码         [super dealloc];            }         */    }    return 0;}
0 0
原创粉丝点击