黑马程序员技术交流社区

标题: oc 加强 笔记 内存 和 野指针 [打印本页]

作者: 天鹰的空    时间: 2015-8-27 18:42
标题: oc 加强 笔记 内存 和 野指针
一,内存管理概念:
    1,内存管理的区域:
        内存管理主要是对内存中的堆区进行管理;


    2,内存管理的内容:
        内存管理只针对继承NSObject的对象进行内存管理,也就是说基本数据类型是不需要内存管理的;


    3,一个APP所占用的内存超过20M时,系统就会向该程序发出,内存警告.


    4,内存管理的原理:
        (1),通过对象的引用计数器(retainCount)管理,当调用对象的retain,new,alloc,copy方法时,引用计数加1;当调用对象的release,autorelease方法时,引用计数减1;
        (2),当对象的引用计数器为0的时候,对a象会被回收;


    5,内存管理的分类:
        (1),MRC,手动管理;
        (2),ARC,自动管理;


    6,当我们的对象被系统回收的时候,会调用NSObject的dealloc方法,我们可以理解为对象的"临终遗言";


    7,重写dealloc方法时:
        (1),先释放子类自己的对象的空间;
        (2),再释放父类的;
            - (void)dealloc
            {
                //1 先释放子类自己的对象的空间
                NSLog(@"Person已经挂了");
                //2 再释放父类的
                [super dealloc];
            }




二,内存管理原则:
    1,谁创建(alloc,new),谁release或者autorelease;
    2,谁retain,copy,mutableCopy,谁release或autorelease;


三,在对象内存管理中,我们研究的内容:
    1,野指针;
        1)定义的指针变量没有初始化;
        2)指向的空间已经被释放了;

    2,内存泄露;
        如果栈区的指针已经释放了,而堆区的空间还没有释放,堆区的空间就被泄露了;


四,nil和Nil及NULL的区别:(面试题)
    nil     是一个对象值;如果我们要把一个对象设置为空的时候就用nil;
    Nil     是一个类对象的值,如果我们要把一个Class类型的对象设置为空的时候就用     Nil ;
    NULL   是一个通用指针;
    NSNull  是一个对象,它用在不能使用nil的场合;



/*******************************下午******************************/

一,
    1,如何避免野指针?
        对象释放完了之后,将指针赋值为nil;
            Dog *d = [[Dog alloc] init];
            [d release];
            d = nil;

    2,如何造成内存泄露?
        一般情况下,都是没有遵守"内存管理的原则";


二,set方法的内存管理:

1)基本数据类型或者非对象类型:直接赋值
int float double long struct enum

-(void)setAge:(int)age
{
    _age=age;
}

2)OC对象类型,需要做如下判断;
-(void)setCar:(Car *)car
{
        //1.先判断是不是新传进来的对象
    if(_car!=car){
        //2 对旧对象做一次release
        [_car release];//若没有旧对象,则没有影响
        //3.对新对象做一次retain
        _car=[car retain];
        
    }
}


三,@property参数:
    1,@property参数:
        1),原子性:atomic和noatomic,分别是加锁和不加锁。加锁安全,性能低;不加锁,不安全,性能高。(默认atomic)(将多线程在讲)
        2),读写属性:readwrite和readonly,读写属性和只读属性。(默认readwrite)
        3),set方法的处理:assign,retain,copy。


    2,具体用法:
        1),在一个类中有关联其他对象的时候,这个对象的 @property 参数需要使用retain;
            @property(nonatomic,retain) Car *car;

        2),在一个类中的实例变量是非对象类型的时候,@property 参数需要使用assign ;
            @property(nonatomic,assign) int age;

    3,通过setter和getter关键字,更改set和get的方法名称;
        @property (nonatomic,assign,setter=isVip:,getter=isVip) BOOL vip;  //_vip

四,@class关键字:
    1,使用格式:  @class 类名;
    @class XXXX;
    含义: 告诉编译器,XXXX 是一个类,至于类有哪些属性和方法,此处不去检测
    好处: 如果XXXX文件内容发生了改变,也不需要重新编译

    2,@class的作用:
        第一个作用是提高编译效率;
        第二个作用是防止重复包含。

    3,@class 的使用注意:
        在.h文件中使用了@class  XXX 声明了一个类之后; 在.m文件中要真正使用这个类的时候,必须得用#import XXX.h 导入这个类的头文件;


    4,import和@class的区别:(面试题)
        作用上的区别:#import会包含引用类的所有信息(内容),包括引用类的变量和方法;
                    @class仅仅是告诉编译器有这么一个类,具体这个类里有什么信息,完全不知。

        效率上的区别:#import编译效率会非常低,@class就不会出现这种情况。


















欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2