黑马程序员-oc对象的内存管理

oc没有java的垃圾回收机制,所以对象的内存释放很重要,基本数据类型,我们不用理会,编译器会处理;

oc的每个对象内部都由一个计数器,用来记录当前有几个指针在指向该对象;当计数器为0时该对象会从内存中释放;

相关方法和概念:

1:retain:对象方法,调用该对象方法,计数器+1,有返回值,返回对象本身;

2:release:没有返回值,计数器-1;

3;retainCount:获取当前计数器的值;

4:dealloc:当对象被回收时,就会调用该方法,覆盖该方法时一定要调用[super
dealloc],且放在最后;释放的顺序一般是先释放子类再释放父类;

概念:

1:僵尸对象:内存已经被回收的对象,僵尸对象是不能在使用的,

2:野指针:指向了僵尸对象(不可用内存)的指针;给野指针发消息会报错:EXE_BAD_ACCESS

3:空指针:没有指向任何对象的指针:值为0、nil、null;给空指针发消息不会报错;

多对象内存管理:

内存管理核心思想:一般来说,类方法:alloc是在堆中开辟空间的,调用了alloc,计数器会+1;所以一旦写了alloc,一定要写release;同样调用了retain,一定要调用release;

当对象较多时,对象之间的组合关系很容易让我们忽视掉了,这个对象的指向者有几个;所以规范严格的写好setter方法和dealloc方法;

内存管理代码规范总结:

1:只要调用了alloc,必须有release(autorelease)

2:setter的规范写法:

*:如果是基本数据类型,则和平常一样;

 *:如果成员变量是对象,也就是组合关系时,比如Person拥有一辆Car;那么Car的setter:

  


- (void)setCar:(Car *)car
{
// 首先判断传入的car是否和存在的car是同一个
if(_car != car)
{
// 先释放以前的car
[_car release];
// 在赋值 ,一定先对新的car做一次retain
_car = [car retain];
}
}

  3:dealloc方法的代码规范:

*:对self (当前) 拥有的其他对象执行一次release

*:一定要调用父类的dealloc [super
dealloc],且要放到最后边;

- (void)dealloc
{
// 对当前对象的其他对象release
[_car release];
[super dealloc];
}

黑马程序员-oc对象的内存管理

时间: 2024-10-04 20:29:58

黑马程序员-oc对象的内存管理的相关文章

黑马程序员 oc对象的方法成员变量

#import <Foundation/Foundation.h> typedef enum { SexMan, SexWoman } Sex; @interface Person : NSObject { /* 成员变量名前用下划线有3个用处 1>方便程序员之间的交流,一看到下划线就知道这个事成员变量 2>为了与getter方法中的方法名区分开 3>不与局部变量名重合 */ int _age; Sex _sex; } // 设置setter和getter方法 // 为了数据

黑马程序员 oc对象的行为和内存分析,匿名对象

#import <Foundation/Foundation.h> @interface Car : NSObject { @public int speed; int wheels; } // oc方法必须是-开头 // oc方法中所有的数据类型必须得用括号括起来 // oc方法中的()就是用来扩住数据类型的 -(void)run; @end @implementation Car - (void)run { NSLog(@"%d个轮子和速度为%d的车子跑起来了!");

黑马程序员 05-OC对象的内存分析

———Java培训.Android培训.iOS培训..Net培训.期待与您交流! ——— 首先,完整的代码如下: 1 //1.类的声明 2 #import <Foundation/Foundation.h> 3 @interface Person : NSObject 4 { 5 @public 6 int _age;//年龄 7 double _weight;//体重 8 } 9 - (void)run;//跑 10 - (void)eat;//吃 11 @end 12 13 14 //2.

黑马程序员-OC对象的三大特性

OC语言是面向对象的语言,其三大特性必不可少. 一.封装是一个很重要的概念,它避免外界直接访问或修改对象的属性,可以过滤不合理的值,让外界不必关心内部的细节.通过set方法来让外部设置成员的属性值,通过get方法来获得对象属性值. 1 #import <Foundation/Foundation.h> 2 @interface Student : NSObject</span></span> 3 { 4 int _age; //以下划线开头,避免和局部变量弄混 5 in

黑马程序员-OC内存管理 @property的增强

涉及到内存管理,只读,多线程等很多功能时,setter和getter方法也就没那么简单了:当然@property依然强大,很好用: 1:内存管理相关参数: *:retain:  (如果是oc对象类型),生成的setter会自动release旧值,retain新值: *:assign:(适用于非oc对象)  这个是默认的值 *:copy:release旧值,copy新值: @property (retain) NSString *name; // 同类型的参数不能同时写 // @property

黑马程序员-OC学习笔记之ARC

---------------------- IOS开发.Android培训.期待与您交流! ----------------------一.什么是ARC        ARC是自动引用计数,苹果官方在Xcode4.2及以后版本中加入的一个内存管理机制,完全取代了程序员人工的内存管理,使得程序员只须关心程序本身.使用ARC,编译器会自动在代码中加入内存管理代码,是一个编译器特性,而不是运行时特性,当然,它也和JAVA的垃圾回收不同,它的本质和手动的内存管理是一样的,只是这些代码编译器会自动添加.

黑马程序员——OC学习笔记—— Copy

黑马程序员——OC学习笔记—— Copy ------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- copy 即对象拷贝 要使用对象数据而不希望修改对象时,可以使用copy copy叫做浅拷贝  mutablecopy深拷贝 copy需要遵守NSCopying协议,实现CopywithZone方法 MutableCopy也一样要遵守相应协议 注意: OC中copy复制的对象都是不可变的  mutablecopy复制的是可变副本 浅拷贝:只拷贝地址,不

黑马程序员-OC学习笔记之autorelease与自动释放池

---------------------- IOS开发.Android培训.期待与您交流! ---------------------- 一.autorelease autorelease与release相似,是OC中的一个对象方法.这两个方法都能把对象的引用计数器减1,但是release是一个精确的减1,对对象的操作只能在release之前进行,如果是在之后,就会出现野指针错误:而autorelease是一个不精确的引用计数器减1,当给对象发送autorelease消息时,对象就会被放到自动

黑马程序员——oc语言学习心得—— 属性声明和赋值

黑马程序员——oc语言学习心得—— 属性声明和赋值 -------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 1,在oc中所有类继承与终极父类Object2,声明字符变量采用N是string  *_xxx 实例变量一般以下划线开头3,在oc中方法以+ -号区分 -号开头是实例方法或对象方法  +号开头是类方法  前置用对象调用 后者用类名调用4,在xcode4以后声明@property 不用在写@snysize  自动生成get.set方法5,属性