今天看了看oc的内存管理,自己管理内存不能随便的release和retain 法则会出现野指针等错误。下面以人和读书的例子做练习。
1.主函数
//
// main.m
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Student.h"
#import "Book.h"
void test1(){
Student *stu=[[Student alloc] init];
[stu retain];
NSLog(@"stu 的计算器为:%zi",[stu retainCount]);//2
[stu release];//1
[stu release];//0
}
#pragma mark 添加书
void addBook(Student *stu){
Book *book=[[Book alloc] initWithPrice:3.5];
stu.book=book;
[book release];
Book *book2=[[Book alloc] initWithPrice:4.5];
stu.book=book2;
[book2 release];
}
#pragma mark 读书
void readBooks(Student *stu){
[stu readBook];
}
#pragma mark 主函数
int main(int argc, const char * argv[])
{
@autoreleasepool {
Student *stu=[[Student alloc] initWithAge:22];
Student *stu1=[[Student alloc] initWithAge:20];
addBook(stu1);
readBooks(stu1);
addBook(stu);
readBooks(stu);
[stu release];//多写[stu release]会出现野指针错误,[nil release]则不会
[stu1 release];
}
return 0;
}
2.Student函数
// Student.h
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Book.h"
@interface Student : NSObject{
int _age;
Book *_book;
}
@property int age;
@property Book *book;
-(id)initWithAge:(int)age;
-(void) readBook;
@end
//
// Student.m
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
//
#import "Student.h"
@implementation Student
@synthesize age=_age;
-(Book *)getBook{
return _book;
}
-(void)setBook:(Book *)book{
if (_book!=book){
//先释放旧的
[_book release];
//再retain 新的
_book=[book retain];
}
}
//重写dealloc方法,当对象的计数器是1时自动调用该方法
#pragma mark - 静态方法
#pragma mark 回收对象
- (void)dealloc
{
[_book release];
NSLog(@"Student %i,内存被释放。",_age);
[super dealloc];
}
#pragma mark - 公共方法
#pragma mark 读书
-(void)readBook{
NSLog(@"当前读的书为:%f",_book.price);
}
#pragma mark 构造函数
-(id)initWithAge:(int)age{
if(self=[super init]){
_age=age;
}
return self;
}
@end
3.Book函数
// Book.h
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Book : NSObject{
float _price;
}
@property float price;
-(id) initWithPrice:(float)price;
@end
// Book.m
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
//
#import "Book.h"
@implementation Book
@synthesize price=_price;
#pragma mark 注销函数
-(void)dealloc{
NSLog(@"Book %f ,被销毁。",_price);
[super dealloc];
}
#pragma mark 构造函数
-(id) initWithPrice:(float)price{
if (self=[super init]){
_price=price;
}
return self;
}
@end