内存(MRC)

一、计数器的基本操作
1> retain : +1,
 方法返回的是对象本身
2> release :-1
3> retainCount : 获得计数器
4> dealloc
  * 当一个对象要被回收的时候,就会调用
  * 一定要调用[super dealloc],这句调用要放在最后面

 
 2.概念
 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用(有时会崩溃
 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
 3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错(
 OC不存在空指针错误,给空指针发送消息,不报错


1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作)

 2.你不想再使用(占用)某个对象,就应该让对象的计数器-1(让对象做一次release)

 3.谁retain,谁release
 
 4.谁alloc,谁release
 
尽量少使用类方法创建对象,因为此时是autorelease,于用户交互时自动释放

 二、set方法的内存管理
1> set方法的实现
- (void)setCar:(Car *)car
{
    if ( _car != car )
    {
        [_car release];
        _car = [car retain];
    }
}

2> dealloc方法的实现(不要直接调用dealloc)
- (void)dealloc
{
//绝对安全:
      self.name = nil;
     self.car = nil;
    [super dealloc];
}

三、@property参数
1> OC对象类型
@property (nonatomic, retain) 类名 *属性名;
@property (nonatomic, retain) Car *car;
@property (nonatomic, retain) id car;

// 被retain过的属性,必须在dealloc方法中release属性
- (void)dealloc
{
    self.car = nil;(注意:该语句等同于release原来的对象,然后对nil进行retain,对nil的任何操作没有作用)
    [super dealloc];
}

2> 非OC对象类型(int\float\enum\struct)
@property (nonatomic, assign) 类型名称 属性名;
@property (nonatomic, assign) int age;

四、autorelease
1.系统自带的方法中,如果不包含alloc、new、copy,那么这些方法返回的对象都是已经autorelease过的
[NSString stringWithFormat:....];
[NSDate date];

2.开发中经常写一些类方法快速创建一个autorelease的对象
* 创建对象的时候不要直接使用类名,用self

init的重写,即自定义构造赋值时应用self.car(注意,为点语法,set或get方法)才能保正绝对安全。
内存管理代码规范:
 1.只要调用了alloc,必须有release(autorelease)
   对象不是通过alloc产生的,就不需要release
 
 2.set方法的代码规范
 1> 
基本数据类型:直接复制

 - (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];
    }
 }
 
 3.dealloc方法的代码规范
 1> 一定要[super dealloc],而且放到最后面
 2> 对self(当前)所拥有的其他对象做一次release

 - (void)dealloc
 {
    self.car = nil;
    [super dealloc];
 }
conllection内存的管理:

collection就是NSArray,NSDictionary,NSSet...等容器类,会自主管理自己内部的元素。

加⼊入collection中的对象会被retain 
移除出collection的对象会被release 
collection被释放会对内部所有对象release 

copy浅拷贝(copy),retain+1,多1指针指向该内存,数组、字典元素为浅拷贝
copy深拷贝(mutablecopy),retain不变,开辟一块新内存,retain由0到1.数组与字典其中的元素仍为浅拷贝
 
NSString *str = [[NSString alloc]init];
//可变、不可变字符串或数组、字典mutablecopy均为可变字符串
或数组、字典
        NSMutableString *str1 = [str mutableCopy];
        NSLog(@"%p,%p",str,str1);
        
        NSMutableString *str2 = [[NSString alloc]init];
        
        //可变、不可变字符串
或数组、字典copy均为不可变字符串或数组、字典
        NSString *str3 = [str copy];
        NSLog(@"%p,%p"
,str2,str3);
 

你可能感兴趣的:(内存)