set方法内存分析

//

//  main.m

//  04-set方法的内存管理分析

//

//  Created by apple on 14-3-17.

//

//

#import <Foundation/Foundation.h>

#import "Person.h"

int main(int argc, const char * argv[])

{

@autoreleasepool {

//p  1

Person * p = [[Person alloc] init];

// c1 1

Car * c1 = [[Car alloc] init];

c1.speed = 100;

//c1 2

[p setCar:c1];

[p drive];

//c1 1

[c1 release];

/*

[p setCar:c1];

[p drive];

*/

//c2 1

Car * c2 = [[Car alloc] init];

c2.speed = 350;

//c2  2

[p setCar:c2];

[p drive];

//c2 1

[c2 release];

//p 0

[p release];

}

return 0;

}

//

//  Person.m

//  01-手动内存管理基本概念

//

//  Created by apple on 14-3-17.

//

//

#import "Person.h"

//配对原则:new alloc retain 对应一个release,autorelease

@implementation Person

- (void)setName:(NSString *)name

{

if (_name != name)

{

[_name release];

_name = [name retain];

}

}

- (NSString *)name

{

return _name;

}

//解决三个问题:1,set多个不同car的时候,内存泄漏[ [_car release];//[nil release];]

2,set相同car的时候,野指针    [ if (_car != car)]

3,调用方法是提前被销毁   [_car  = [car retain];]

- (void)setCar:(Car *)car

{

if (_car != car)

{   //c1 0

//relese旧值

[_car release];//[nil release];

//c2 2

//retain新值

_car  = [car retain];

}

}

- (Car *)car

{

return _car;

}

- (void)drive

{

[_car run];

}

- (void)dealloc

{

//目的是要保证在p对象存在的时候,car对象一定存在

//对象p被销毁的时候,

//0

//c2 0

[_car release];

[_name release];

[super dealloc];

NSLog(@"Person 被销毁了");

}

@end

时间: 2024-11-04 09:06:37

set方法内存分析的相关文章

java执行程序的内存分析系列专栏二之static变量和方法内存分析

昨天写了简单的聊了下java执行程序时简单的内存划分,今天我们接着往下聊,聊聊static变量和方法的内存分析. 1.static变量和方法的第一个特性内存分析 statiic变量和方法的第一个特性能通过类名.static变量和类名.static方法的形式调用,而普通只能对象的形式调用.但具体为什么是这样的,这得分析static变量和方法他们在内存中怎样分配的,因此在这里我首先建立一个学生类,里面有一个普通成员变量和一个静态成员变量以及一个普通方法和一个成员方法,然后建立了一个测试学生的类. 1

方法与对象内存分析

---方法区内存:在类加载的时候,class字节码代码段被加载到该内存空间中---栈内存(局部变量):方法代码段片段执行的时候,会给该方法分配内存空间,在栈内存中压栈,执行完毕之后释放内存空间,做弹栈操作.---堆内存(实例变量):new的对象在堆内存中存储.方法内存分析 public class Hello { public static void main(String[] args) { int a = 100; int b = 200; int res = sum(a, b); Syst

Eclipse中的快捷键快速生成常用代码(例如无参、带参构造,set、get方法),以及Java中重要的内存分析(栈、堆、方法区、常量池)

Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池) 以上就是Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.堆.方法区.常量池)的全部内容了,更多内容请关注:CPP学习网_CPP大学 本文固定链接:CPP学习网_CPP大学-Eclipse中的快捷键快速生成常用代码(例如无参.带参构造,set.get方法),以及Java中重要的内存分析(栈.

Java内存状况查看方法和分析工具

Java本身提供了多种丰富的方法和工具来帮助开发人员查看和分析GC及其JVM内存的状况,同时开源界也有一些工具用于查看和分析GC和JVM内存的状况. 通过这些分析,可以排查程序中内存泄露的问题及调优程序的性能. 1.输出GC日志 输出GC日志对于跟踪分析GC的状况来说,无疑是最直接的分析内存回收状态的方法,只是输出之后需要人为的去分析,来判断GC的状况. JVM支持将日志输出到控制台和指定的文件中,方法如下: a>输出到控制台 在JVM的启动参数中加入-XX:+PrintGC -XX:+Prin

Java连载29-方法执行内存分析、方法重载

一.JVM包含三个内存区:栈内存.堆内存.方法区内存 二.注意点 (1)在MyEclipse中字体是红色的是一个类的名字,并且这个类除了我们自定义的类是JavaSE类库中自带的 (2)其实JavaSE类库中自带的类,例如:String.class\System.class,这些类的类名也是标识符 (3)只要是类名就一定是标识符 内存分析举例: public class D29_{ public static void main(String[] args) { int a = 10; int b

java 内存分析之方法返回值二

package Demo; class Point { private double x, y; public Point(double x, double y) { this.x = x; this.y = y; } public double getX() { return x; } public void setX(double x) { this.x = x; } public double getY() { return y; } public void setY(double y)

JS内存泄漏 和Chrome 内存分析工具简介(摘)

原文地址:http://web.jobbole.com/88463/ JavaScript 中 4 种常见的内存泄露陷阱 原文:Sebastián Peyrott 译文:伯乐在线专栏作者 - ARIGATO 链接:http://web.jobbole.com/88463/ 点击 → 了解如何加入专栏作者 了解 JavaScript 的内存泄露和解决方式! 在这篇文章中我们将要探索客户端 JavaScript 代码中常见的一些内存泄漏的情况,并且学习如何使用 Chrome 的开发工具来发现他们.读

[转]对tableView三种计算动态行高方法的分析

tableView是一个神奇的东西,可以这么说,就算是一个初学者如果能把tableView玩的很6,那编一般的iOS的需求都问题不大了.tableView是日常开发中用烂了的控件,但是关于tableView中的自定义cell的动态行高,还是有一些玄机的.笔者本次主要是因为预估行高的方法的问题作为了一个契机顺带写了此文对几种动态行高方法的分析. 旧方法 现在常规的动态行高的计算方法还是用 [str boundingRectWithSize:size options:NSStringDrawingU

js:深入prototype(上:内存分析)

/** * 以下演示了通过原型的创建方式,使用基于原型的创建可以将属性和方法 * 设置为Person专有的,不能通过window来调用. * 原型是javascript中的一个特殊对象,当一个函数创建之后,会随之就产生一个原型对象 * 当通过这个这个函数的构造函数创建了一个具体的对象之后,在这个具体的对象中,就会有一个属性指向原型 */ //第一种状态 function Person(){                        } //第二种状态 Person.prototype.nam