黑马程序员-OC-内存管理(非ARC模式下)

------- IOS培训、android培训、java培训、期待与您交流! ----------

管理范围:所有继承NSObject的类对象

 内存泄露?内存泄露的后果?
  自己申请的内存,没有释放  会使内存中存在很多的垃圾,浪费不必要的内存

 1.应用计数器:用于计算对象被使用的次数,是一个整数(每个对象都有自己的引用计数器:占4个字节

(1)当使用alloc、new或copy创建新对象时,新对象的引用计数器被设置为1.

(2)当引用计数器为0时,则此对象所占用内存就会被回收。(发送release消息时,计数器减1)

(3)给对象发送retainCount消息获取当前的计数器值

注:retain方法返回的是对象本身(有返回值)

 2.对象的销毁

(1)引用计数器为0,对象占用的内存被系统收回。(对象变成僵尸对象。指向此方法的指针值变为0)

(2)当对象被销毁时,系统会自动向对象发送dealloc消息。(对象遗言)

(3)一般要重写dealloc方法。(必须调用super的dealloc)

1         - (void)dealloc
2             {
3              [super dealloc];
4             }
5  

 3.概念

(1)野指针:指向僵尸对象(不可用内存)的指针。

注:给野指针发送消息会报错,报错提示:EXC_BAD_ACCESS

(2)僵尸对象:所占用内存已经被回收的对象,僵尸对象不能再使用、

(3)空指针:没有指向任何东西的指针(存储的东西是nil、NULL、0)

注:给空指针发送消息不会报错

 4.内存管理原则:

(1)当想使用(占用)某个对象时,就应该让对象的计数器+1 (让对象做一个ratain操作)

(2)当不想使用(占用)某个对象时,就应该让对象的计数器-1 (让对象做一次release操作)

(3)谁retain,谁release;谁alloc,谁release。

注:对象在set方法中赋值时,应该进行一次retain操作。(基本数据类型不需要管理内存 )

5.set方法内存管理

(1)只要调用了alloc,则必须要有release(或autorelease);

如果对象不是通过alloc产生,则不需要release。

(2)set方法代码规范

1)基本数据类型:直接赋值(基本数据类型不需要进行内存管理)

1 - (void)setAge:(int)age
2        {
3          _age = age;
4          }  

2)OC对象类型

1 -  (void)setCar:(Car *)car
2                      {
3                         if ( car != _car) // 1.先判断是不是新传进来的对象
4                             {
5                                 [_car release]; // 2.对旧对象做一次release
6                                  _car = [car retain]; //  3.对新对象做一次retain
7                             }
8                         }  

(3)dealloc代码规范

1>一定要有[super dealloc],而且要放到最后。

2>对self(当前)所拥有的其他对象做一次release

1 - (void)dealloc
2      {
3       [_car release]; // 一旦Person release,则车也应该release
4       [super dealloc]; // 这段一定要放最后
5      }  

[email protected] 内存管理

@property (参数)  对象

eg :@property (nonatomic,retain) Car *car;

(1)set方法内存管理的相关参数

retain:生成的setter方法中会release旧值,retain新值。(适用于OC对象类型)

assin:直接赋值(默认,适用于非OC对象类型)

copy: release旧值,copy新值

(2)是否要生成set方法

readwrite:可读写,同时生成setter和getter的声明、实现(默认)

readonly:只读,只会生成getter的声明、实现。

(3)多线程管理(多个线程同时调用某个方法)

nonatomic:代表方法不要考虑线程安全性问题,告诉系统不在set方法中生成多线程代码。(高性能,禁止多线程,推荐使用)

atomic:代表给方法进行加锁,保证线程安全(默认,低性能)

线程保护机制:防止方法在未写入完成时,被其它线程调用,造成数据错误。

(4)setter和getter方法的名称

setter:setter = 方法名,决定了set方法的名称,方法名一定有冒号:

getter:决定了get方法的名称。(一般用在BOOL类型)

 7.循环retain和@class

1>(1)@class使用方法:

作用:  @class Card    仅仅告诉编译器,Card只是一个类

使用场合:用于.h声明此类,但是不会引入此类的方法和成员变量。

注意点:仅仅声明这个类,不会将此类的方法和成员变量导入,如果需要,则应该在.m文件中#import此类。

(2)引用一个类的规范

1>在.h头文件中用@class来声明类

2>在.m源文件中用#import来包含类的所有东西

(3)@class优点

1>解决循环包含的问题。- >只在.m 源文件中进行引用(可以循环声明,A中声明B,B中声明A)

2>提高了性能。->如果被引入类的头文件进行了修改,不需要全部进行重新编译。

(4)@class 和 #import 区别

1> #import方式会包含被引用类的所有信息,包括被引用类的变量和方法;(使用类所有信息,包括成员变量和方法)
               @class方式只是告诉编译器在A.h文件中 ,声明某个类,不知道此类的所有具体信息。(仅仅声明有这个类)

2>如果有上百个头文件都#import了同一个文件,那么一旦被导入文件的头文件稍有改动,后面引用到这个

文件的所有类的头文件都需要重新拷贝,效率较低。(A->B,B->C,C->D.....一旦A变动,则后面都需要重新编译。程序只编译.h文件)

使用@class方式就不会出现这种问题了,只需在源文件中修改类即可,提高了效率。

(解决了循环包含问题)

3>在.m实现文件中,如果需要引用到被引用类的成员变量或方法时,还需要使用#import方式引入被引用类。

   2> 两端循环引用解决方法(循环retain)
             一端用retain,一端用assign。、

Car 端 : @property (nonatomic,retain)   Person *person;

Person端:@propertor (nonatomic,assign) Car *car

8. autorelease 

eg: Person *p = [[[Person alloc] init] autorelease]; //必须存在释放池,才能写autorelease

作用:1>autorelease会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里所有对象做一次release。

2>返回对象本身,且不影响对象计数器。

注:池子被销毁时,对象不一定会被销毁,只是做一次release。释放池内可嵌套释放池

@autoreleasepool

{  //  { 代表开始创建释放池

}  //  } 代表销毁释放

优点:1>不用在关心对象释放的时间.

2>不需要关心什么使用调用release。

缺点:不能精确控制对象销毁时间。

使用注意:1>占用内存较大的对象不要随便使用autorelease(不能精确控制对象销毁时间)

2>占用内存较小的对象使用,则不会有太大影响。

时间: 2024-12-24 10:12:05

黑马程序员-OC-内存管理(非ARC模式下)的相关文章

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

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

黑马程序员— OC内存管理

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 之前我们学习过C语言的内存剖析,对于iOS移动设备开发来说,内存是极其有限的,因此管理好内存是相当重要的当移动设备的程序占用太多内存无法释放,有可能就会导致我们平时经常会遇到的闪退现象,这时就需要回收一些不需要再使用的内存空间,比如不需要使用的对象或者变量. 管理范围:任何继承NSObject的对象,对其他的基本数据类型(int.char.float.double.struct.enum等)无

黑马程序员——OC内存管理

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 手动内存管理 *为什么要学习内存管理? ①由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的. ②当我们对Objective-C 的内存管理机制琢磨不透时,编写的程序经常内存泄漏或崩溃. ③当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. *Object-C内存管理范围 只管理任何继承了NSObject的对象,不管理其他基本数据类型(int.

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

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

[黑马程序员]Objective-C 内存管理

引用计数器 每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少东西在使用这个对象.对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁. 在每个OC对象内部,都专门有4个字节的存储空间来存储引用计数器. 作用: 判断对象要不要回收的唯一依据就是计数器是否为0,若不为0则存在. 操作: 给对象发送消息,进行相应的计数器操作. Retain消息:使计数器+1,该方法返回对象本身 Release消息:使计数器-1(并不代表释放对象) retainCount消息

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工

黑马程序员--Objective-C 内存管理我之见解

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 内存管理 为什么要进行内存管理? 因为设备的内存空间是有限的,如果一直占用,而不回收空间,内存就会被一直占用,导致内存不足,  系统就会就会报警,严重的可能直接退出程序,因此,在软件开发过程中,需要进行内存管理,以保证高效快速的分配内存,

黑马程序员—17-oc内存管理

一.   内存管理基本原理 OC中内存管理机制的原理:对象的及时释放 l  什么是内存管理 Ø   移动设备的内存极其有限,每个app所能占用的内存是有限制的 Ø   当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一些不需要使用的对象.变量等 Ø   管理范围:任何继承了NSObject的对象,对其他基本数据类型(int.char.float.double.struct.enum等)无效 l  引用计数器: u  1.概念: 每个OC对象都有自己的

黑马程序员___OC__内存管理

内存管理 引用计数器 当一个对象被创建出来,就要分配给内存这个对象,当不用这个对象的时候,就要及时的回收,为了可以明确知道对象有没有被使用,就要用引用计数器来体现,只要计数器不为0,表明对象被使用中. 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> dealloc * 当一个对象要被回收的时候,就会调用 * 一定要调用[super dealloc],这句调用

黑马程序员-1.内存管理

一. OC的内存管理的过程 OC为每个对象提供一个内部计数器,这个计数器跟踪对象的引用计数,当对象被创建或拷贝时,引用计数为1,每次保持对象时,调用retain接口,引用计数加1,如果不需要这个对象时调用release,引用计数减1,当对像的引用计数为0时,系统就会释放掉这块内存,释放对象调用dealloc. for example: 1.对象在完成创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系