zoukankan      html  css  js  c++  java
  • Object-c学习之路二(oc内存管理黄金法则1)

    今天看了看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
    











  • 相关阅读:
    [2018福大至诚软工助教]原型设计+用户规格说明书小结
    高等数理逻辑大作业
    [2018福大至诚软工助教]测试与优化小结
    [2018福大至诚软工助教]结对项目小结
    BETA 版冲刺前准备
    Alpha冲刺之事后诸葛亮
    Alpha 冲刺 (10/10)
    Alpha 冲刺 (9/10)
    Alpha 冲刺 (8/10)
    Alpha 冲刺 (7/10)
  • 原文地址:https://www.cnblogs.com/snake-hand/p/3211980.html
Copyright © 2011-2022 走看看