内存管理2-set方法的内存管理-程序解析

创建class Book

.h 有@ property float price;  //@synthesize 自动

------------

创建class Student

#import "Book.h"

.h 有@property int age;

@property Book *book;         //@synthesize 自动

--------------

验证Student对象是否回收

Student.m

-(void)dealloc{

NSLog(@"Student :%i 被销毁了",_age);

[super dealloc];

}

--------------

为了方便访问_age 创建可以传入_age 的构造方法

Student.h

-(id)initWithAge:(int)age;

student.m

-(id)initWithAge:(int)age{

if(self=[super init]){   //如果super返回的对象不为空

_age=age;

}

return self;

}

----------------------

验证Book对象是否回收

Book.m

-(void)dealloc{

NSLog(@" book:%f 被销毁了",_price);

[super dealloc];

}

----------------------------

//with _price Book constructor

Book.h

-(void)initWithPrice:(float)price;

Book.m

-(void)initWithPrice:(float)price{

if(self=[super init]){   //如果super返回的对象不为空

_price=price;

}

}

----------------------------

annotation method

1 #pragma mark constructor

(advantage:easy:locate)

2 #pragma mark -groupname

(advantage :group)

3 Of course // can work

----------------------------

main.m

#import "Book.h"

#import "Student.h"

main(){

@autoreleasepool{

Student *stu=[[Student alloc]initWithAge:10]; //stu 1

Book *book =[[Book alloc]initWithPrice:3.5];// book 1

stu.book=book;// In reality never use this way//book 1

[book release];//book 0

[stu release];//stu 0

}

return 0;

}

---------------------------------

Student.m

//manually realize getter & setter

//Standard realization of getter and setter

Student.h   // Because u do manually so XCode will not call  @synthesize, so there is no //_book,so we need to state _book ourself.

@interface Student:NSObject{

Book *_book;

}

Student.m

-(void)setBook:(Book *)book{

_book=book;

}

-(Book *)book{

return _book;

}

// Abopve six line can be short for

//@synthesize book=_book;

---------------------------------------

Then counter

-----------------------------------------

// When we developing in reality ,we may use object

//so change code

//main.m

void test (Student *stu){

Book *book=[[Book  alloc]initWithPrice:3.5];

stu.book=book;

[book release];

}

void test1(Student *stu){

//add reading method

//Student.h -(void)readBook;

//Student.m

//-(void)readBook{

//NSLog(@"Reading book is:%f",_book.price);

//}

[stu readBook];// not safe ,visiting _book,because in test book is released so (wild pointer)

}

-------------------------

//change code

main(){

test(stu);

test1(stu);

}

-----------------------------

//student want to make use of book object so, retain book in Student

//setBook retain;stu alloc release

---------------------------------

//Improve code

// so compare the passed book object  with current book object if not the same one,

//release the previous one.

-(void)setBook:(Book *)book{

if(self.book!=book){

[_book release];             // empty pointer is safe.

_book=[book retain];

}

}

//被释放(-1)和被销毁(0)不同

时间: 2024-10-08 20:43:44

内存管理2-set方法的内存管理-程序解析的相关文章

七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 [email protected]参数 [email protected]和循环retain的使用 6.NSString的内存管理

1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一

内存泄露、内存溢出以及解决方法

内存泄露是指程序在运行过程中动态申请的内存空间不再使用后没有及时释放,从而很可能导致应用程序内存无线增长.更广义的内存泄露包括未对系统的资源的及时释放,比如句柄等. 内存溢出即用户在对其数据缓冲区操作时,超过了其缓冲区的边界:尤其是对缓冲区写操作时,缓冲区的溢出很可能导致程序的异常. 一.内存泄露 "知己知彼,方能百战不殆",如果我们能够比较清楚的了解在编程的时候哪些情况容易导致内存泄露,通过避免这些糟糕的情况,从提高代码的质量本身出发,来抵御潜在导致内存泄露的发生. 1.1先来看看内

小白学开发(iOS)OC_ set方法的内存管理分析(2015-08-04)

// //  main.m //  set方法的内存管理分析 // //  Created by admin on 15/8/5. //  Copyright (c) 2015年 admin. All rights reserved. // #import <Foundation/Foundation.h> #import "Person.h" int main(int argc, const char * argv[]) { @autoreleasepool { //p 

OC中的属性、方法及内存管理

普通方法:关注(代表)对象可以”干什么”,过程中需要实例变量.-(void)show;输出 … 访问属性    属性:属性专门处理实例变量.(程序执行过程当中)    初始化方法:一创建对象(第一时间),给实例变量赋值.    工厂方法:只一个方法,帮我们解决创建对象问题.初始化对象的问题.工厂方法创建对象最简单.(对象达到一定量级) 补:在类方法中,可以调用类中创建的实例的实例方法或实例变量. 算法.设计模式:是人们总结的一种规律,一种思想. 1.单例模式    是一种特殊的工厂方法.    

OC --(9)-- 内存管理初级:内存管理的方式、引用计数机制,影响计数的各个方法、dealloc方法、内存管理的基本原则、掌握copy的实现

iOS应?程序出现Crash(闪退),90%以上的原因是内存问题. 在一个拥有数十个甚?至是上百个类的?程里,查找内存问题极其困难. 了解内存常?问题,能帮我们减少出错几率. 内存问题体现在两个方面:内存溢出.野指针异常. 1.野指针异常 内存管理的方式 引用计数 影响引用计数的方法有 +alloc -retain -copy -release -autorelease

objective C 内存管理及属性方法详解

oc为每个对象提供一个内部计数器,这个计数器跟踪对象的引用计数,当对象被创建或拷贝时,引用计数为1,每次保持对象时,调用retain接口,引用计数加1,如果不需要这个对象时调用release,引用计数减1,当对像的引用计数为0时,系统就会释放掉这块内存,释放对象调用dealloc 当对象包含其他对象时,就得在dealloc中自己释放他们 NSObject是IOS所有类的基类 有两个基本函数,alloc和dealloc alloc类似于C++的new,dealloc类似于delete 当对象的re

【转载】Unity 优雅地管理资源,减少占用内存,优化游戏

转自:星辰的<Unity3D占用内存太大的解决方法> 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大. 这里写下关于Unity3D对于内存的管理与优化. Unity3D 里有两种动态加载机制:一个是Resources.Load,另外一个通过AssetBundle,其实两者区别不大. Resources.Load就是从一个缺省打进程序包里的AssetBundle里加载资源,而一般AssetBundle文件需要你自己创建,运行时 动态加载,可以指定路径和来源的. 其实场景里所有静

黑马程序员----内存管理之三——《@property的内存管理》

内存管理之三——<@property的内存管理> 1.@property中与setter内存管理相关的参数 retain : release旧值,retain新值(适用于OC对象类型): assign : 直接赋值,(默认,适用于非OC对象类型): copy  : release旧值,copy新值: 2.@property中是否生成setter的参数 readonly  : 只会生成getter的声明和实现: readwrite : 同时生成setter和getter的声明和实现: 3.@pr

[Android 性能优化系列]内存之提升篇--应用应该如何管理内存

应用应该如何管理内存 在软件开发的各个阶段,你都应该时候注意你的RAM消耗(即便是在括软件的设计阶段).这里有很多种途径,通过使用它们可以帮助你设计和写出更有效率的代码, 你应该在设计和实现应用的时候采用以下的这些技术来让降低应用的内存消耗. 尽可能少的使用服务 如果你的应用需要使用服务来进行后台操作,那么尽可能让他在的确需要工作的时候才进行工作.另外请确保当你的工作完成之后结束掉你的服务. 当你开启一个服务的时候,系统会在服务运行的时候保留它的进程,这会让这个进行变得非 常庞大,因为服务所消耗

Java虚拟机内存区域堆(heap)的管理

在上一节中Java 出现内存溢出的定位以及解决方案 中对于Java虚拟机栈以及方法区的内存出现的异常以及处理方式进行了解析,由于Java虚拟机对于堆的管理十分复杂,并且Java虚拟机中最基本的内存区域,所以单独提出一节进行分析. 先来解释一下对象存活?? 什么样的对象是已经死了的对象,须要垃圾回收器进行回收.这个概念至关重要.由于它影响到垃圾回收器对于哪一个对象进行回收.能够从GCRoot訪问到的对象是存活的对象,那么以外的对象就是已死的对象. GCRoot:包含四种 1)Java虚拟机栈中存放