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
    











  • 相关阅读:
    linux日常管理-rsync后台服务方式-1
    linux日常管理-rsync_ssh方式
    linux日常管理-rsync常用选项详解
    linux日常管理-rsync格式
    socket 服务端 | socket 客户端 -->黏包现象
    udp 服务端 | udp 客户端 --循环发消息
    udp 协议 服务端 | udp 客户端
    socket tcp 服务端 | socket tcp 客户端 -->之循环
    socket tcp 服务器 | socket tcp 客户端
    计算器写法 | '1-2*((60-30+(-40/5)*(9-2*5/3+7/3*99/4*2998+10*568/14))-(-4*3)/(16-3*2))'
  • 原文地址:https://www.cnblogs.com/lixingle/p/3313061.html
Copyright © 2011-2022 走看看