有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;
}
内存计数基础原理
原创
©著作权归作者所有:来自51CTO博客作者hongmin118的原创作品,请联系作者获取转载授权,否则将追究法律责任
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
折线法计数、反射原理
折线法与反射原理
算法 i++ 字符串 数据