小白学开发(iOS)OC_手动内存管理(2015-08-02)

来源:互联网 发布:郭德纲相声知乎 编辑:程序博客网 时间:2024/05/18 15:30
 //
//  main.m
//  手动内存管理
//
//  Created by admin on 15/8/3.
//  Copyright (c) 2015年 admin. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {

/*
    当我们创建一个对象时:
        1. 分配内存空间,存储对象
        2. 初始化成员变量
        3. 返回对象的指针地址
 
    1. 对象在完成创建的同时,内部会自动创建一个引用计数器retainCount,这个计数器是系统用来判断对象时候回收的唯一依据,当对象的引用计数器ratainCount = 0时,系统会立刻回收当前对象,事实上retainCount是每个对象的一个属性,可以调用
    2. [对象 release]     作用是:retainCount - 1
    3. [对象 retain]      作用是:ratainCount + 1
    4. 当对象的retainCount = 0 的时候,对象就被回收销毁了
    5. 当一个对象要被销毁的时候,系统会自动调用dealloc函数,用来通知对象将被销毁了,这个函数只要作用是让程序员知道那个对象已经被销毁了,是NSObject的函数,可以重写来显示那个对象被回收
    6. 手动内存管理原则(配对原则):只要出现了new、alloc、retain,就一定要出现一个release或autorelease
 注 7. 手动内存管理主要研究两个方面的问题:
        ① 野指针操作
        ② 内存泄露
 */
//  这里首先练习一下重写dealloc函数
    
    Person *p = [[Person alloc]init];  //retainCount = 1;
    
    NSLog(@"%lu",p.retainCount);
    
    [p retain];    //  retainCount = 2;
    
    NSLog(@"%lu",p.retainCount);
    
    [p release];    //  retainCount = 1
    
    NSLog(@"%lu",p.retainCount);
    
    [p release];    //  retainCount = 0 被销毁了
    
//  NSLog(@"%lu",p.retainCount);  上一步P这对象已经被销毁了,这里如果再通过这个被销毁的对象调用,就会是野指针,出现错误
    return 0;
}
//
//  Person.h
//  手动内存管理
//
//  Created by admin on 15/8/3.
//  Copyright (c) 2015年 admin. All rights reserved.
//

#import <Foundation/Foundation.h>

@interface Person : NSObject

@end
//
//  Person.m
//  手动内存管理
//
//  Created by admin on 15/8/3.
//  Copyright (c) 2015年 admin. All rights reserved.
//

#import "Person.h"

@implementation Person

- (void)dealloc
{
//  在对象自身被销毁之前,一定要先调用[super dealloc]释放父类中的相关对象
    [super dealloc];
    NSLog(@"Person 被销毁了");
}
@end
0 0
原创粉丝点击