内存管理2对象之间的内存管理

简介: Book.h: #import @interface Book : NSObject@property float price;-(id)initeWithPrice:(float)price;@end Book.

Book.h:

#import <Foundation/Foundation.h>

@interface Book : NSObject
@property float price;
-(id)initeWithPrice:(float)price;
@end

Book.m:

#import "Book.h"

@implementation Book
#pragma mark 构造方法
-(id)initeWithPrice:(float)price
{
    if(self=[super init])
    {
        _price=price;
    }
    return self;
}
#pragma mark 回收方法
-(void)dealloc{
    NSLog(@"Book:%f 被销毁了",_price);

    [super dealloc];
}
@end

Student.h:

#import <Cocoa/Cocoa.h>
@class Book;

@interface Student : NSObject
{
    Book * _book;
}
@property int age;
-(id)initWithAge:(int)age;
@property Book * book;
-(void)readBook;
@end

Student.m:

#import "Student.h"
#import "Book.h"

@implementation Student
#pragma mark - 生命周期方法
-(id)initWithAge:(int)age{
    if(self=[super init])
    {
        _age=age; 
    }
    return self;
}
-(void)dealloc
{
    [_book release];
    NSLog(@"Student: %i被销毁了",_age);
    [super dealloc];
}

//如果手动设置getter和setter方法 Xcode就不会帮我们自动生成synthesize,也就不会自动生成带下划线的属性
#pragma mark - 设置getter和setter方法
#pragma mark setter方法
-(void)setBook:(Book *)book
{
    if(_book!=book)
    {
    //先释放旧对象,再retain新对象
    [_book release];//OC里面没有空指针释放错误 [nil release]不报错
    //book:1
    _book=[book retain];
    }

}
#pragma mark getter方法
-(Book *)book{
    return _book;
}
#pragma mark - 公共方法
#pragma mark 读书
-(void)readBook{
    NSLog(@"当前读的书的价格是:%f",_book.price);
}
#pragma mark - 私有方法
#pragma mark 私有方法1
-(void)test1{
    
}
#pragma mark 私有方法2
-(void)test2{

}
#pragma mark 私有方法3
-(void)test3{

}
@end

main:

#import <Foundation/Foundation.h>
#import "Student.h"
#import "Book.h"

void test(Student * stu){
    //book:1
    Book * book=[[Book alloc] initeWithPrice:11.2];
    //book:2
    stu.book=book;
    //book:1
    [book release];

    Book * book1=[[Book alloc] initeWithPrice:22.2];
    stu.book=book1;
    [book1 release];
}
void test1(Student *stu)
{
    [stu readBook];
}
int main(int argc, const char * argv[])
{

    @autoreleasepool {

//        Student *stu=[[[Student alloc] initWithAge:10] autorelease];
//        NSLog(@"Student age is %i",stu.age);
//        Book *book=[[Book alloc] initeWithPrice:11.1f];
//        NSLog(@"Book price is %.1f",book.price);
//
//        stu.book=book;
//        NSLog(@"%@",stu.book);
//        [book release];
        //计数器
        //stu 1
        
        Student *stu=[[Student alloc] initWithAge:10];
        //book:1
        //stu:1
        test(stu);
        //book:1
        //stu:1
        test1(stu);
        //stu:0
        //book:0
        [stu release];  //在释放stu时候也释放book,因为stu在setter的时候retain了一下,就由它释放

        Student * stu1=[[[Student new]initWithAge:20] autorelease];
        test(stu1);

    }
    return 0;
}
结果:

2013-08-02 15:01:11.571 内存管理2 a对象之间的内存管理[832:303] Book:11.200000 被销毁了

2013-08-02 15:01:11.573 内存管理2 a对象之间的内存管理[832:303] 当前读的书的价格是:22.200001

2013-08-02 15:01:11.573 内存管理2 a对象之间的内存管理[832:303] Book:22.200001 被销毁了

2013-08-02 15:01:11.574 内存管理2 a对象之间的内存管理[832:303] Student: 10被销毁了

2013-08-02 15:01:11.574 内存管理2 a对象之间的内存管理[832:303] Book:11.200000 被销毁了

2013-08-02 15:01:11.574 内存管理2 a对象之间的内存管理[832:303] Book:22.200001 被销毁了

2013-08-02 15:01:11.575 内存管理2 a对象之间的内存管理[832:303] Student: 20被销毁了


相关文章
|
1月前
|
存储 程序员 C++
内存管理概念 (二)
内存管理概念 (二)
26 1
|
1月前
|
存储 算法 程序员
内存管理概念(一)
内存管理概念(一)
48 0
|
2月前
|
存储 监控 Java
深入剖析堆和栈的区别及其在内存管理中的影响
深入剖析堆和栈的区别及其在内存管理中的影响
|
3月前
|
C++
C/C++内存管理(1):C/C++内存分布,C++内存管理方式
C/C++内存管理(1):C/C++内存分布,C++内存管理方式
|
4月前
|
C语言 C++
【C++基础(九)】C++内存管理--new一个对象出来
【C++基础(九)】C++内存管理--new一个对象出来
|
4月前
|
存储 安全 编译器
C++智能指针:更简单、更高效的内存管理方法
C++智能指针:更简单、更高效的内存管理方法
172 0
|
存储 缓存 算法
体系结构及内存分配
体系结构及内存分配
75 0
|
10月前
|
存储
内存管理函数
内存管理函数
|
编译器 C语言 C++
C++基础 之 C++ 中的内存管理问题
C++基础 之 C++ 中的内存管理问题
74 0
|
存储 算法 Unix
C++内存管理基础
本文将讲述C++内存管理的相关知识。
71 0