Object-c学习之路二(oc内存管理黄金法则1)
2013-07-23 18:28 Lves Li 阅读(191) 评论(0) 收藏 举报今天看了看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
 
                    
                     
                    
                 
                    
                 
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号