OC之内存分配

1.OC中内存管理方式分MRC和ARC两种

MRC:手动管理引用计数。ARC:自动管理引用计数。

ARC实现的原理是MRC。

2.引起引用计数变化的方法

加1:alloc,retain,copy;

减一:release(引用计数立即减一),autorelease(在未来的某个时刻引用计数减一,这个时刻跟autoreleasepool有关);

3.操作引用技术的原则

有alloc,retain,copy就要有相应的release,autorelease;没有的话就不进行任何操作;

4.自动释放池(autorelease)的操作

作用:管理自动释放(autorelease)的对象。

系统在开发者创建工程时会在应用程序的主线程中创建一个默认的自动释放池(子线程中不创建)此释放池生命周期为整个应用程序的生命周期。开发者添加自动释放池使用@autoreleasepool{}(生命周期为大括号内)。如果程序中有多个自动释放池,那么,自动释放的对象由离他最近的释放池管理。如果自动释放池和大循环一起操作,自动释放池放在循环内部,防止产生的大量临时对象不能被及时释放;当应用程序和用户之间产生交互,系统会自动帮用户创建自动释放池,管理交互过程中产生的临时对象,交互结束,释放池生命周期结束。

5.属性的内存管理(assign,retain,copy)

如果属性声明时使用的关键字为assign,不需要在类内部进行内存管理;

如果属性声明时使用的关键字为retain和copy,需要在类内部进行内存管理,需要重写dealloc方法。在dealloc中对属性对性的对象发送release消息。eg:

@interface Person : NSObject

@property (retain) NSString *firstName;

@property (retain) NSString *lastName;

@property (assign, readonly) NSString *fullName;

@end

@implementation Person

// ...

- (void)dealloc

[_firstName release];

[_lastName release];

[super dealloc];

}

@end

6.容器类内存管理

将对象添加进入容器,容器对象会对容器内部对象进行引用计数的保留(也就是计数+1,retain)

从容器中移除该对象,容器会对对象release(计数-1)

容器对象进行release,会对容器的所有对象发送release(容器内所有对象减一)

7.copy

给系统类的不可变对象发送copy消息会对该对象的引用计数加1 (和retain功能相同)

如果给系统类可变对象发送copy消息会创建出不可变的副本,原对象引用计数不变,副本对象引用计数加1;

给系统类的不可变对象发送mutableCopy消息,得到的是一个可变的对象副本,源对象引用计数不变,副本引用计数+1;

给系统的可变对象发送mutableCopy消息,会得到一个可变的对象副本,源对象引用计数不变,副本+1

容器中的对象全部都是指针拷贝(浅拷贝)。

如果自定义类要实现copy方法,必须先遵守NSCopying协议,实现copyWinthZone方法。

不可变的容器在使用了mutableCopy后会变成可变的;

不论是深拷贝还是浅拷贝,容器里面的元素都是浅拷贝;

可变的数组在接收了Copy后变成一个不可变的数组;

OC之内存分配

时间: 2024-10-12 13:19:38

OC之内存分配的相关文章

OC语言--内存管理

1.内存管理原理的介绍 1.1C的内存管理 char *p = (char *)malloc(100*sizeof (char)); 这是C的动态内存分配,我们手动跟系统申请了100个字节的内存:或者说系统在堆里开辟了100个字节的空间,并将这个空间的首地址返回给指针变量p. strcpy(p,"Hello World!"); 将字符串拷贝给指针变量p指向的内存空间. puts(p); 将p指针指向的内存空间里的字符串打印出来. free(p); 使用完成后,手动跟系统释放内存空间:或

OC基础 内存管理

OC基础  内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free(p); c语言内存管理存在的缺陷: (1)不释放就会造成内存泄露. (2)多次释放就会造成崩溃. (3)大型项目中多人对一块内存进行操作时,不能释放内存,因为不知道别人是否还在使用. oc语言的内存管理 1.内存管理 (1)引用计数. (2)内存管理的黄金法则:谁创建谁释放. 让我们来看一下测试例

OC基础(十二)内存简单介绍和OC的内存管理

一.内存简单介绍 内存结构 1.运行时分配 (1)栈:用户存放程序临时创建的局部变量(先进后出). (2)堆:动态分配内存段. 2.编译器分配 (1)BSS段:存放未初始化的全局变量和静态变量. (2)数据段:已初始化的全局变量和静态变量. (3)代码段:执行代码的一块区域. 地址由低到高:代码段 -> 数据段 -> BSS段-> 堆 -> 栈 内存分配方式 1.从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量

【c/c++】内存分配大小

测试平台:linux 32位系统 用sizeof()运算符计算分配空间大小.单位:字节 1. 数组名与变量名的区别 int main() { char q[] = "hello"; cout << "q:" << sizeof(q) << endl; char *mq = q; cout << "mq:" << sizeof(mq) << endl; const char *

JAVA中堆栈和内存分配

(一).栈.堆 1.寄存器:最快的存储区, 由编译器根据需求进行分配,我们在程序中无法控制.2. 栈:存放基本类型的变量数据和对象的引用,但对象本身不存放在栈中,而是存放在堆(new 出来的对象)或者常量池中(字符串常量对象存放在常量池中.)3. 堆:存放所有new出来的对象.4. 静态域(属于方法区) :存放静态成员(static定义的)5. 常量池 (属于方法区):存放字符串常量和基本类型常量(public static final).6. 非RAM存储:硬盘等永久存储空间这里我们主要关心栈

Lua2.4 内存分配 mem.c

先看看头文件里的定义,定义了一些出错信息,几个内存管理接口,和宏.几个宏的定义也是用到了内存分配的几个接口.newvector 在之前的词法分析里已经出现了.几个接口,看函数名字比较容易看出来它的作用.下面看一下它们各自的实现: void luaI_free (void *block) {   if (block)   {     *((int *)block) = -1;  /* to catch errors */     free(block);   } } 释放内存.设置 -1 的那个地

内存分配算法 之 首次适应-最佳适应

程序在向操作系统申请内存空间的时候,操作系统会扫描空闲块链表并从中取出一块足够大的分配,与之对应的算法有 首次适应 和 最佳适应,顾名思义,首次适应就是把首次遇到的足够大的空闲块分配给应用程序,最佳适应就是扫描完空闲块链表把大小与申请空间最匹配的空闲块分配给应用程序. mem.h        程序用到的头文件 main.c       主函数 fit.c        具体的实现函数 这里使用make来编译使用,若是读者还没接触过make的, 请移步参考我写的这篇文章:http://netca

C++ Primer 学习笔记_98_特殊工具与技术 --优化内存分配

特殊工具与技术 --优化内存分配 引言: C++的内存分配是一种类型化操作:new为特定类型分配内存,并在新分配的内存中构造该类型的一个对象.new表达式自动运行合适的构造函数来初始化每个动态分配的类类型对象. new基于每个对象分配内存的事实可能会对某些类强加不可接受的运行时开销,这样的类可能需要使用用户级的类类型对象分配能够更快一些.这样的类使用的通用策略是,预先分配用于创建新对象的内存,需要时在预先分配的内存中构造每个新对象. 另外一些类希望按最小尺寸为自己的数据成员分配需要的内存.例如,

内存分配及堆与栈的区别

1.内存分配方式 内存分配方式有三种: 1.从静态存储区域分配.内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在.例如全局变量,static变量. 2.从堆栈上分配.函数内的局部变量的存储单元,函数执行结束时这些存储单元自动被释放.栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限. 3.从堆上分配,亦称动态内存分配.程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存.动态内存的生存期由程序员决定