关于内存管理

最近都是ARC写代码,弄了一下午整理了一下MRC的使用,原创哦!~!~~

1 任何继承NSObject的对象,都需要管理内存
2 基本数据类型放到栈中,对象放到堆空间中
3 oc对象 nil指针 release
不报错
4 僵尸对象检测 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾选Enable zomble
objects

---------单个对象的内存管理---------

每个对象给引用计数器分配四个字节的存储空间,当对象的引用计数器为零时,系统自动回收对象
对象 retain 计数器加1

对象 alloc retain copy 引用计数器加1

dealloc 对象被销毁,系统会自动给对象发送一条dealloc方法
dealloc里面写东西一定最后调用[super dealloc];

ios的main函数是个死循环

---------多个对象之间的内存管理---------

oc对象管理内存

内存管理

1 任何继承NSObject的对象,都需要管理内存
2 基本数据类型放到栈中,对象放到堆空间中
3 oc对象 nil指针 release
不报错
4 僵尸对象检测 stop右-》Edit Scheme-》Diagncatics-》 Objective-C-》勾选Enable zomble
objects

---------单个对象的内存管理---------

每个对象给引用计数器分配四个字节的存储空间,当对象的引用计数器为零时,系统自动回收对象
对象 retain 计数器加1

对象 alloc retain copy 引用计数器加1

dealloc 对象被销毁,系统会自动给对象发送一条dealloc方法
dealloc里面写东西一定最后调用[super dealloc];

ios的main函数是个死循环

---------多个对象之间的内存管理---------

oc对象管理内存

1 Set方法:将传进来的对象,给类的_成员变量,赋值。
2 Get方法:返回_成员变量.

3 关于set方法的内存管理流程(以人书为例):
set方法,将传进来的book给_book赋值,先要对book
做一次retain计数器加一
_book=[book retain];

person类被销毁时,会调用dealloc方法,所有在这里要对_book最一次release,

4 set方法的标准写法(非常重要)

- (void)setCar:(Car *)car

{

if (car!=_car) { // 1
[_car release];// 2

_car=[car retain]; // 3

}
}
注释:set方法,提供方法以便修改一个类下划线成员变量的值,
1
正常情况下,只修改一次成员变量的值,只写3即可(将传入的对象retain下在赋值),
2
如果再次修改成员变量值,则需要对之前传入的对象做一次release,即当前对象_car。
3 为了严谨,需加判断,现在传入的对象非当前对象。

5 - (Car *)car

{

return car;

}

6 - (void)dealloc
{

// 1:对当前所拥有的所有对象做一次relase方法

[_car release];

[super
dealloc];
}

在MRC中 4,5,6是setter getter的标准写法
// 2:最后调用

//property

//property只影响Getter/Setter方法,dealloc还需自己手动释放
@property Book *book;

//property 变量 意味着:生成带下划线的成员变量,自动生成setter/getter方法.

//Setter方法是直接赋值(无release旧值 retain新值操作)
//getter方法是返回

//如果两个方法你都手动实现,意味着覆盖原来生成的get/set方法

//如果只实现get/set其中的一个方法,还是会生成带下划线的成员变量,原方法不会被覆盖.

//@property(retain) Book *book;

参数retain:意味着 release旧值 retain新值
被retain的对象,一定要在dealloc中release下

//@property(assign) int age;
参数assign:意味着 直接赋值(默认就是直接赋值)

//@property(copy) Book *book;
参数copy:意味着 release旧值 retain新值

//@property(readonly/readwrite)
只生成get方法/set方法

PS:所以MRC中,property需要配合dealloc使用

//循环引用
@class:仅仅告诉编译器这是一个类.就可以引用一个类
一方包含头文件
把两边头文件中的#import换成@class即可
实现文件中#import.

//解决循环引用问题:
两端 一边用@property(retain)
dealloc继续release
一边用@property(assign) dealloc无需release

//autorelease
//@autoreleasepool

当对象 调用autorelease方法时,系统会将对象放到释放池中,对对象的计数器无任何影响

//@autoreleasepool PS:ios5.0之后的

//在ios5.0之前 需要创建一个自动释放池对象,在销毁!~
@autoreleasepool
{//开启释放池

}
//结束释放池(池中所有对象做一次release操作)

自动释放池是存在系统的栈中的(这和局部变量的栈不是一个),栈的特点是先进后出

自动释放池是存在系统的栈中的(这和局部变量的栈不是一个),栈的特点是先进后出

关于内存管理

时间: 2024-12-25 00:22:51

关于内存管理的相关文章

linux内存管理

一.Linux 进程在内存中的数据结构 一个可执行程序在存储(没有调入内存)时分为代码段,数据段,未初始化数据段三部分:    1) 代码段:存放CPU执行的机器指令.通常代码区是共享的,即其它执行程序可调用它.假如机器中有数个进程运行相同的一个程序,那么它们就可以使用同一个代码段.     2) 数据段:存放已初始化的全局变量.静态变量(包括全局和局部的).常量.static全局变量和static函数只能在当前文件中被调用.     3) 未初始化数据区(uninitializeddata s

Block内存管理实例分析

在ios开发中,相信说道block大家都不陌生,内存管理问题也是开发者最头疼的问题,网上很多讲block的博客,但大都是理论性多点,今天结合一些实例来讲解下. 存储域 首先和大家聊聊block的存储域,根据block在内存中的位置,block被分为三种类型: NSGlobalBlock NSStackBlock NSMallocBlock 从字面意思上大家也可以看出来 NSGlobalBlock是位于全局区的block,它是设置在程序的数据区域(.data区)中. NSStackBlock是位于

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

OC内存管理

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

39-oc集合中对象的内存管理

集合中对象的内存管理 集合的内存管理原则是什么 当把一个对象添加到集合中时,这个对象会做了一次retain操作,计数器会+1 当一个集合被销毁时,会对集合里面的所有对象做一次release操作,计数器会-1 当一个对象从集合中移除时,会对这个对象做一次release操作,计数器会-1 集合方法的普遍规律是什么 如果方法名是add\insert开头,那么被添加的对象,计数器会+1 如果方法名是remove\delete开头,那么被移除的对象,计数器-1

iOS基础 ----- 内存管理

Objective-C 的内存管理方式有引用计数机制,垃圾回收机制,自动释放池.有alloc,就有释放.iOS应?程序出现Crash(闪退),90%的原因是因为内存问 题.在?个拥有数?个甚?是上百个类的?程?,查找内存问 题极其困难,学会内存管理,能帮我们减少出错的?率.内存问题体现在两个??:内存溢出.野指针异常. 引用计数器 在Xcode4.2及之后的版本中由于引入了ARC(Automatic Reference Counting)机制,程序编译时Xcode可以自动给你的代码添加内存释放代

c++ 块内存管理

#pragma once   //头文件 #include<iostream> #include<string.h> #include<list> #include "TypeTraits.hpp"  //类型萃取 #include <stdarg.h> using namespace std; struct SaveAdapter//保存适配器 基类 { virtual void save(const char* fmt, ...) =

魏兆辉的IOS基础学习笔记之十二 OC语言基础-07 Foundation内存管理

本篇博文,将给大家介绍下再Objective-C中如何使用内存管理.一个程序运行的时候,如果不及时的释放没有用的空间内存.那么,程序会越来 越臃肿,内存占用量会不断升高.我们在使用的时候,就会感觉很卡,最终使得程序运行奔溃.因此,将无效的内存及时清理释放,是非常有必要的. 一个对象在最初创建使用,到最后的回收释放,经历的是怎样一个过程呢?包括:诞生(通过alloc或new方法实现).生存(接收消息并执行操作).交友(通过复合以及向方法传递参数).最终死去(被释放掉). 一.引用计数 在对象创建的

OC -内存管理

管理内存有三种方式 1:垃圾回收,在java中常见的管理内存方法,系统自动检测对象是否被使用,是否被释放 2.MRC: 手动管理引用计数,iOS管理内存的方式,程序员通过手动方式来管理对象是否被释放 3.ARC: 自动管理引用计数:基于MRC,系统自动的管理内存 引用计数:retainCount 当我们使用一个指针指向一块内存的时候,应该对这块内存做retain操作,引用计数+1.当我们不再使用这个指针指向这块内存,应该对这块内存做release操作,引用计数-1.这样可以使引用计数值一直保持等

linux内核探索之内存管理(四):对页表和页表项的操作

接上一节,主要参考<深入Linux内核架构>(3.3节),即linux-3.18.3 1. 对PTE的操作 最后一级页表中的项不仅包含了指向页的内存位置的指针,还在上述的多于比特位包含了与页有关的附加信息.尽管这些数据是特定于CPU的,它们至少提供了有关页访问控制的一些信息.下列位在linux内核支持的大多数CPU中都可以找到. arch/x86/include/asm/pgtable_types.h #define _PAGE_BIT_PRESENT 0 /* is present */ #