码迷,mamicode.com
首页 > 其他好文 > 详细

黑马程序员--oc基础第五篇

时间:2015-03-01 20:58:04      阅读:155      评论:0      收藏:0      [点我收藏+]

标签:

五.oc的语法基础(内存管理上)

1.引用计数器:在每一个对象里都有一个引用计数器,占用4个字节的空间,在一个对象创建时引用计数器的值初始化为1.

*给对象发送一条retain消息,可以使引用计数器的值+1(retain方法返回对象本身)

*给对象发一条release消息,则计数器的值-1

*可以给对象发送retaincount消息来获取当前引用计数器的值

*当一个对象被销毁时,系统会自动向对象发送一条dealloc消息,就像遗言一样,可以对他进行改写,一但改写就必须调用[super dealloc]方法,且该方法必须放在最后

*不要直接调用的dealloc方法

*以后凡是见到retain就要用release,见到alloc就要用release。

以上是部分内存管理的内容遵循的原则就是“谁污染,谁治理,谁创建,谁销毁的原则”,下面我自己谢了一个非ARC形式的程序,大家认真读一下

main.m

#import <Foundation/Foundation.h>
#import "Perosn.h"
#import "Student.h"
#import "Book.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        Student *stu=[Student new];//stu=1
        Book *book=[Book new];//book=1
        stu.book=book;//book=2 stu=1
        book.stu=stu;//book=2 stu=1
        
        
        [book release];//book=1,stu=1
        [stu release];//book=1,stu=0;
        
    }
    return 0;
}

 

Person.h

#import <Foundation/Foundation.h>

@interface Perosn : NSObject

@property (nonatomic,assign) int age;


@end

Person.m

#import "Perosn.h"

@implementation Perosn

-(void)dealloc
{
    NSLog(@"Person 对象被释放了!!!!");
    [super dealloc];
}

@end

Student.h

 

#import "Perosn.h"
@class Book;
@interface Student : Perosn

@property (nonatomic,retain) Book *book;

@property (nonatomic,assign) int no;


@end

 

Student.m

#import "Student.h"
#import "Book.h"
@implementation Student

-(void)dealloc
{
    [_book release];//book= 0; stu=0;
    NSLog(@"Student 对象被释放了!!!!");
    [super dealloc];
}
@end

Book.h

#import <Foundation/Foundation.h>
#import "Student.h"
@interface Book : NSObject

{
    Student *_stu;
}

- (void)setStu:(Student *)stu;

- (Student *)stu;
@end

BOOK.m

#import "Book.h"

@implementation Book

-(void)setStu:(Student *)stu
{
//    if(_stu!=stu)
//    {
//        [_stu release];
//        _stu=[stu retain];
//    }
    _stu=stu;
}

-(Student *)stu
{
    return _stu;
}

-(void)dealloc
{
    NSLog(@"Book 对象被释放了!!!!");
    
    [super dealloc];
}
@end

 

每当引用了一个对象类型的数据计数器的值就会+1,每当释放一个对象,对象计数器的值-1。

2.野指针,出现野指针的根本原因在于对象是存放在堆中,而指针是存放在栈中的,所以当引用计数器的值为0的时候,对象释放了,但是这是指向这个对象的指针还在,所以 就出现了,指向一个对象的指针是不可用的。出现错误

所以一把呢解决方法是p=nil什么时候用完了就释放指针,因为oc中空指针调用方法,不产生任何效果,也不会出现任何错误,所以说不会出错

 

3.当使用非ARC机制是成员变量的set方法的写法:

 

#import "Car.h"

@implementation Car

- setCar:(Car *)car
{
    if (car!=_car) {
        [_car release];
        _car=[car retain];
    }
}

- (void)dealloc
{
    [_car release];
    [super dealloc];
}
@end

 

以上是就是非ARC机制下的内存管理,认真阅读你将受益匪浅。

 

黑马程序员--oc基础第五篇

标签:

原文地址:http://www.cnblogs.com/keeganlee/p/4307541.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!