有new、alloc、copy(计数器加一),就得release(计数器减一)
// // Person.h // a1 // // Created by mahongmin on 14-4-21. // Copyright (c) 2014年 mahongmin. All rights reserved. // #import <Foundation/Foundation.h> #import "Book.h" @interface Person : NSObject { Book *_book; } - (void) setBook:(Book*)book; - (Book*) book; @end ================ // // Person.m // a1 // // Created by mahongmin on 14-4-21. // Copyright (c) 2014年 mahongmin. All rights reserved. // #import "Person.h" @implementation Person - (void) setBook:(Book*)book { if (book != _book)// 防止p.book = b; 再来一次p.book = b { [_book release];// 此场景:如果p.book = b1,然后p.book = b2 那么,就需要此行来把b1 release掉。 _book = [book retain];// book传递进来,那么等于Person对book进行了一次占用 内存占用+1 } } - (Book*) book { return _book; } -(void)dealloc { // 当销毁人的时候,需把人占用的book也销毁 [_book release]; NSLog(@"释放人对象"); [super dealloc]; } @end ====================== // // Book.h // a1 // // Created by mahongmin on 14-4-23. // Copyright (c) 2014年 mahongmin. All rights reserved. // #import <Foundation/Foundation.h> @interface Book : NSObject @end =========================== // // Book.m // a1 // // Created by mahongmin on 14-4-23. // Copyright (c) 2014年 mahongmin. All rights reserved. // #import "Book.h" @implementation Book - (void) dealloc { NSLog(@"释放book对象"); [super dealloc]; } @end ==================================== // // main.m // a1 // // Created by mahongmin on 14-4-21. // Copyright (c) 2014年 mahongmin. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" #import "Book.h" int main(int argc, const char * argv[]) { Person *p = [[Person alloc] init]; Book *b = [[Book alloc] init]; p.book = b;//此时,b指针指向的Book,计数为2 [b release]; b = nil; [p release];// 如果多次乱调[r release],写了p=nil后,此处不会再报EXC_BAD_ACCESS野指针错误。此时p为空对象,给空对象发送消息,不会产生空指针错误。跟java不一样 p = nil; return 0; }