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

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被销毁了

时间: 2024-09-10 11:24:03

内存管理2对象之间的内存管理的相关文章

解析PHP中的内存管理,PHP动态分配和释放内存

本篇文章是对PHP中的内存管理,PHP动态分配和释放内存进行了详细的分析介绍,需要的朋友参考下   摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存在PHP中,填充一个字符串变量相当简单,这只需要一个语句"<?php $str = 'hello world '; ?>"即可,并且该字符串能够被自由地修改.拷贝和移动.而在C语言中,尽管你能够

Flink内存管理源码解读之内存管理器

回顾 上一篇文章我们谈了Flink自主内存管理的一些基础的数据结构.那篇中主要讲了数据结构的定义,这篇我们来看看那些数据结构的使用,以及内存的管理设计. 概述 这篇文章我们主要探讨Flink的内存管理类MemoryManager涉及到对内存的分配.回收,以及针对预分配内存而提供的memory segment pool.还有支持跨越多个memory segment数据访问的page view. 本文探讨的类主要位于pageckage : org.apache.flink.runtime.memor

解析PHP中的内存管理,PHP动态分配和释放内存_php技巧

摘要 内存管理对于长期运行的程序,例如服务器守护程序,是相当重要的影响:因此,理解PHP是如何分配与释放内存的对于创建这类程序极为重要.本文将重点探讨PHP的内存管理问题. 一. 内存在PHP中,填充一个字符串变量相当简单,这只需要一个语句"<?php $str = 'hello world '; ?>"即可,并且该字符串能够被自由地修改.拷贝和移动.而在C语言中,尽管你能够编写例如"char *str = "hello world ";&qu

我所理解的Remoting(2):远程对象生命周期的管理[上篇]

1.CLR的垃圾回收机制 在.NET中提到对象的生命周期,我们会不由自主地想到CLR的垃圾回收.在运行一个.NET程序过程中,我们通过某种方式,比如通过new操作符,通过反序列化,通过反射机制,创建一个对象,CLR在为这个对象在托管堆中开辟一块内存空间.随着程序的运行,创建的对象越来越多,托管堆中的可用的内存越来越少,必须有一种机制来判断被分配在托管堆中的对象那些已经不被使用,以及进行对这些对象占用的内存进行回收.这种机制被称为CLR自动内存管理,也就是我们常说的垃圾回收.为了说清楚远程对象的生

我所理解的Remoting (2) :远程对象的生命周期管理[下篇]

在上一篇文章中([原创]我所理解的Remoting(2):远程对象生命周期的管理-Part I),我简要的讲述了CLR的垃圾回收机制和Remoting 基于Lease的对象生命周期的管理.在这篇文章中,我们将以此为基础,继续我们的话题.在文章的开始,我将以我的理解详细地讲述Remoting中两个重要的概念--Lease和Sponsorship.然后我通过一个Sample,为大家演示如何以不同的方法延长远程对象的生命周期. 我们先不谈远程对象.本地对象. 不管是远程的对象,还是本地对象,都对于程序

java中基本类型封装对象所占内存的大小(转)

这是一个程序,java中没有现成的sizeof的实现,原因主要是java中的基本数据类型的大小都是固定的,所以看上去没有必要用sizeof这个关键字. 实现的想法是这样的:java.lang.Runtime类中有一些简单的能涉及到内存管理的函数: Every Java application has a single instance of class Runtime that allows the application to interface with the environment in

spring管理struts2对象,管理成单例对象纠结的问题

问题描述 需求:1>为了满足性能测试需求,不能用struts2原有的多例对象,必须单例对象2>用spring管理struts2对象,而且要单例我就纠结了,不管spring 怎么管理struts2对象都行,非要单例.单例对象怎么能满足大并发量请求的问题?难道spring容器会造struts2对象的副本,有spring容易自动管理内存?从性能测试角度,是单例的好,很省内存.但从大并发请求考虑,我还是觉得struts2原有的方式不错. 解决方案 Spring 自动默认并且推荐也是单例!引用难道spr

《树莓派实战秘籍》——2.4 技巧24在GPU和Linux用户之间划分内存

2.4 技巧24在GPU和Linux用户之间划分内存 你从树莓派获得的性能和你分配给它的核心组件的内存数量是紧密关联的,因为它不是一个你可以放入更多RAM的系统,因此你必须根据你的项目需要以最好的方式分配有效内存. 在嵌入式硬件的世界里,内存几乎总是一个珍贵而稀缺的东西.系统性能通常和存在的(以及可访问的)内存紧密关联.此外,大多数嵌入式系统并没有提供任何用户可以维护的方法来提高物理内存的大小,而树莓派并无不同. 当B型树莓派首次发布时,它自带了256MiB1内存(可能是Hynix Mobile

使用VS2010的Database项目模板统一管理数据库对象

使用VS2010的Database 项目模板统一管理数据库对象 Visual Studio 2010 有一个数据库项目模板:Visual Studio Database Project(以下简称VSDP),VS 2003/2005/2008也有类似的项目,在VS2010上的得到了很大的加强,现在还具备了智能感知,构建时验证和自动部署功能,VSDP是针对典型的数据库开发任务而设计的,可以对原有数据库反向工程,添加表,存储过程和其他数据库项目,而且有选择性地将修改部署到目标数据库中.他的主要特性有: