有new、alloc、copy(计数器加一),就得release(计数器减一)标签:Person,mahongmin,计数,Book,内存,import,release,原理,book From: https://blog.51cto.com/u_21817/6066891
//
// 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;
}