Objective-C学习笔记 内存管理

引用计数

每个对象都有一个与之相关联多整数,被称作它的引用计数器或保留计算器,当某段代码需要访问一个对象时,该代码就将该对象的保留计数器值加1,表示我要访问该对象,当这段代码访问结束的时候,将对象的保留计数器数值减1,表示不再访问该对象了。当保留计数器的值为0时,表示不再有代码访问该对象了,此时它将被销毁同时占用的内存被回收。

对象的保留计数器值初始值为1。当一个对象即将要被销毁的时候,OC会向对象发送一条dealloc消息,这条消息可以在自己的对象中重写。

常见的几种调用方法:

-(id) retain;

-(oneway void) release;

-(NSUInteger) retainCount;

Eg:

#import <Foundation/Foundation.h>

@interface RetainTra : NSObject

@end

@implementation RetainTra

-(id) init

{

if (self = [super init]) {

NSLog(@"init : This is first call -- %d .",[self retainCount]);

}

return (self);

}

-(void) dealloc

{

NSLog(@"dealloc called . Bye Bye..");

[super dealloc];

}

@end

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

RetainTra *tracker = [ RetainTra new]; //count:1 此处直接调用了init

[tracker retain];//count 2

NSLog(@"%d--1",[tracker retainCount]);

[tracker retain];//count 3

NSLog(@"%d--2",[tracker retainCount]);

[tracker release]; //count 2

NSLog(@"%d--3",[tracker retainCount]);

[tracker release]; //count 1

NSLog(@"%d--4",[tracker retainCount]);

[tracker release]; //count 0 调用了dealloc。。

//NSLog(@"%d--5",[tracker retainCount]);

return 0;

}

对象所有权

如果一个对象内有指向其他对象的实例变量,则称该对象拥有这些对象。如。car对象拥有其指向的engine和tire对象。同样,如果一个函数创建了一个对象,则称该函数拥有这个对象。

访问方法中的保留和释放

一个更好的解决对象释放问题的代码

-(void) setEngine :(Engine *) newEngine

{

[newEngine retain];

[engine release];

engine = newEngine;

}//setEngine

首先保留了新的engine对象,即使newEngine与engine是同一个对象,保留计数器的值也将先增加,然后立即减少。由于没有归0,engine对象意外的未被销毁,这样避免了错误发生。

在访问方法中,如果先保留新对象,然后再释放对象就不会出现问题了。

自动释放

不知道为什么,看到这个词的时候,前面一直紧张的内心忽然平静了下来。。。



今天在看引用计数和对象所有权上花了很多时间,加上老师讲了很多关于函数的基础概念,需要慢慢记忆的东西很多。

时间: 2024-10-12 22:03:18

Objective-C学习笔记 内存管理的相关文章

JVM学习笔记-内存管理

第一章 内存分配 1. 内存区域. 方法区和堆(线程共享),程序计数器 , VM栈 和 本地方法栈(线程隔离). 1) java虚拟机栈:线程私有.描述的是java方法执行的内存模型:栈帧,用户存储 局部变量表,操作数栈,动态链接,方法出口等信息. 局部变量表在编译时即可完全确定!如果线程请求的栈深度大于 规定的深度,StackOverflowError. 2) 本地方法栈,类似. 3)堆:垃圾收集器管理的主要区域.线程共享. 4)方法区: 各个线程共享.存储:加载的类信息,常量,静态变量,即时

2015 IOS 学习笔记 内存管理,页面跳转 ——蓝懿教育

——————————内存管理———————————————— 手动内存管理(MRC)中常用的三个方法 retain:导致内存计数+1 release:导致内存计数-1 copy:复制出来一个新的对象 和之前对象的数据可能一致 但是 不是同一个对象 此对象内存计数是1 autorelease:自动释放 当变量出了自动释放池之后会自动释放 自动释放池在项目中有很多看不见的 属性描述关键字: retain/strong: //如果是retain 会做两件事 //-(void)setNames:(NSM

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不

Cocos2d-x学习笔记—内存管理机制

Cocos2d-x 3.x内存管理机制 1:C++内存管理 1-1:内存分配区域 创建对象需要两个步骤:第一步,为对象分配内存:第二步,调用构造函数初始化内存.在第一步中,可以选择几个不同的分配区域.这几个区域如下: (1) 栈区域分配.栈内存分配运算内置于处理器的指令集中,效率很髙,但是分配的内 存容量有限.由处理器自动分配和释放,用来存放函数的参数值和局部变量的值等.在执 行函数时,函数内局部变量的存储单元都可以在栈上创建,函数执行结束时这些存储单元自动被释放. (2) 堆区域分配.从堆上分

C++学习笔记-内存管理与指针

一.使用new和delete时,应遵循以下规则: 1.不要使用delete来释放不是new分配的内存. 2.不要使用delete释放同一个内存块两次. 3.如果使用new[]为数组分配内存,则应使用delete[]来释放. 4.如果使用new[]为一个实体分配内存,则应使用delete(没有方括号)来释放. 5.对空值指针应用delete是安全的. 二.句点操作符和箭头操作符的规则: 1.如果结构标识符是结构名,则使用句点操作符: 2.如果标识符是指向结构的指针,则应使用箭头操作符(->)

Linux内存管理学习笔记——内存寻址

最近开始想稍微深入一点地学习Linux内核,主要参考内容是<深入理解Linux内核>和<深入理解Linux内核架构>以及源码,经验有限,只能分析出有限的内容,看完这遍以后再更深入学习吧. 1,内存地址 逻辑地址:包含在机器语言中用来指定一个操作数或一条指令的地址. 线性地址:一个32位无符号数,用于直接映射物理地址 物理地址:片上引脚寻址级别的地址 2,逻辑地址->线性地址 2.1 段选择符与段寄存器 逻辑地址:段选择符(16位)+段内偏移(32位) index:在GDT或L

Linux 程序设计学习笔记----进程管理与程序开发(上)

转载请注明出处,http://blog.csdn.net/suool/article/details/38406211,谢谢! Linux进程存储结构和进程结构 可执行文件结构 如下图: 可以看出,此ELF可执行文件存储时(没有调入内存)分为代码区.数据区和未出花数据区三部分. 代码区:存放cpu的执行的机器指令. 数据区:包含程序中的已经初始化的静态变量,以及已经初始化的全局变量. 未初始化数据区:存入的是未初始化的全局变量和未初始化的静态变量. 现在在上面的程序代码中增加一个int的静态变量

Linux 程序设计学习笔记----进程管理与程序开发(下)

转载请注明出处:http://blog.csdn.net/suool/article/details/38419983,谢谢! 进程管理及其控制 创建进程 fork()函数 函数说明具体参见:http://pubs.opengroup.org/onlinepubs/009695399/functions/fork.html 返回值:Upon successful completion, fork() shall return 0 to the child process and shall re

Objective -C Memory Management 内存管理 第一部分

Objective -C Memory Management??内存管理??第一部分 Memory management is part of a more general problem in programming called resource management. 内存管理是资源管理的一部分. Every computer system has finite resources for your program to use. These include memory, open fi