蜗牛风采网

登录

内存使用相关文章最新报道

admin 举报

内存使用相关文章最新报道与最新报道

注意2:每当一个对象在自动释放池中收到一条消息时,该对象将在自动释放池被销毁时收到一条消息

使用方法注意事项

在将对象放入自动释放池之前,必须在自动释放池中调用方法

即使在自动释放池中创建了对象,只要不使用该方法,该对象也不会被放入自动释放池中。

即使在自动释放池之外创建了对象,只要在自动释放池中调用该方法,该对象就会被放入自动释放池中

在一个程序中可以创建n个自动释放池,并且自动释放池可以嵌套。这些自动释放池存在于堆栈结构中(先进先出)。当一个对象调用一个方法时,它将被放在堆栈顶部的自动释放池中

Zx。wNFCw。cn

内存无法准确释放(延迟释放),因为自动释放池只有在池中的所有内容都被执行后才会被释放,所以最好使用占用大量内存的东西

创建您自己的自动发布池

Cocoa希望代码在自动释放池中执行,否则,发送自动释放消息的对象将不会收到释放消息,这将导致内存泄漏。UIKit库将处理自动发布池中的每个事件周期,因此我们不需要显式地创建自动发布池,但是在以下三种情况下,我们仍然需要创建我们自己的自动发布池

如果开发不是基于UIframework,它是基于命令行工具的

在使用循环时,尤其是循环数量较大,内存占用很大的时候,可以在循环内部创建自己的自动释放池,每次都销毁临时变量,避免大量临时变量的积累,导致短时间内存占用过多

如果生成大量的第二线程,线程必须一执行就创建自己的自动释放池,否则程序会泄漏内存(这需要以后详细补充)

for(inti=0;i999999I){ @ autore lease pool { Person * p=[[Personalloc]init]autore lease];//dosomething.}}

类工厂方法内存管理

在开发中,我们经常在基础框架中使用类。当调用它的类工厂方法来创建一个对象时,因为它不是由alloc、new、copy或mutableCopy方法创建的,所以我们不需要自己向对象发送释放或自动释放消息,因为类工厂方法在返回对象之前已经延迟了释放。

我们在编写自己的类工厂方法的时候,也要和系统一样处理。快速返回自动重新发布对象的方法如下

(instancetype)Person{//用self代替Person,因为它可以在子类调用此方法时返回子类对象return[[[self alloc]init]auto relest];}

快速返回带有参数的自动重新发布对象的方法如下

(instance type)Person with name :(NSString *)name { Person * Person=[[self alloc]init]auto release];person.name=namereturnperson}

注意:对于基础框架中的类,由类工厂方法创建的所有对象都是自动释放的,因此您不必自己释放它们

集合中对象的内存管理

Zx。wNFCw。cn

集合包括iOS中的NSArray、NSDictionary和NSSet。接下来,以数组为例解释集合中的内存管理规则

内存使用相关文章最新报道与最新报道

将对象添加到数组中,数组将对该对象执行保留操作

释放数组时,会向数组中的每个对象发送一条释放消息

Zx。wNFCw。cn

当数组移除一个对象时,它会向该对象发送一条释放消息

NSMutableArray * array=[NSMutableArray array];for(Nsuintegeri=0;i10I){ NSNumber * allocedNumber=[[NSNumberalloc]initwithin integer : I];//将allocedNumber对象添加到数组中,数组会对对象执行一个retain操作[Array AddObject : allocedNumber];[allocedNumberrelease];}//当数组对象被释放时,系统会向数组中的每个allocedNumber对象发送释放消息,以保证数组中的每个元素都能正常释放

内存管理中的两种使用场景

当指针指向的对象是数组中的一个元素时,如果数组移除了该元素或数组对象本身被释放,则指针指向的对象已被释放

Zx。wNFCw。cn

heisenObject=[arrayobjecattindex :n];[arrayremoveobjectatindex :n];//从数组中移除heisenObject,将会收到一条释放消息。此时,heisenObject所指向的对象已经释放。//在实际开发中,我们不希望出现这种情况,所以需要使用re内存使用相关文章最新报道tain来拥有对象Heisenobject=[[arrayobjecattindex 3360n]Retain]的所有权;[arrayremoveobjectatindex :n];//dosomething。

..[heisenObjectrelease];

当一个指针所指向的对象是通过另一个对象获得的,如果另一个对象自身被释放,此时该指针指向的对象已经被释放了

idparent=#createaparentobject#heisenObject=[parentchild];[parentrelease];//heisenObject所指向的对象是通过另一个对象(例子中的parent对象)获得的,另一个对象是该对象的唯一拥有者,如果另一个对象被释放了,此时heisenObject所指向的对象已经被释放了//在实际开发中,我们并不希望这样的情况发生,所以需要使用retain拥有该对象的所有权idparent=#createaparentobject#heisenObject=[[parentchild]retain];[parentrelease];//dosomething...[heisenObjectrelease];

iOS内存管理之ARC

概述

ARC(AutomaticReferenceCounting,自动引用计数),是iOS4引入的一项新技术(从iOS5开始支持弱引用),其使用与MRRMRC相同的内存管理规则来管理内存,不过编译器会在编译阶段自动地在适当的位置插入retain、release和autorelease等内存管理代码来管理内存(属于编译器特性,不是运行时特性),不再需要程序人员手动管理.官方强烈建议使用ARC方式来管理内存

注:OC中的ARC和Java中的垃圾回收机制不一样,Java中的垃圾回收是系统做的,而OC中的ARC是编译器做的

展示ARC与MRC使用区别的小示例

Zx。wNFCw。cn

//MRC@interfacePerson:NSObject@property(retain)NSNumber*number;@end@implementationPerson-(void)dealloc{NSLog(@"Persondealloc");[_numberrelease];[superdealloc];}@endPerson*person=[[Personalloc]init];NSNumber*number=[[NSNumberalloc]initWithInt:2];person.number=number;[numberrelease];[personrelease];//perosn和number正常被释放//ARC@interfacePerson:NSObject@property(strong)NSNumber*number;@end@implementationPerson-(void)dealloc{NSLog(@"Persondealloc");}@endPerson*person=[[Personalloc]init];NSNumber*number=[[NSNumberalloc]initWithInt:2];person.number=number;//perosn和number出了作用域正常被释放

ARC管理内存的优势

消除了手动管理内存的烦恼,不再需要手动调用retain、release和autorelease等方法来管理内存(实际上在ARC模式下已经不能调用出来该方法了),编译器在编译阶段会自动地在适当的位置插入这些代码,这样可以极大概率地避免出现内存问题.同时编译器也会在一些地方执行某些优化,让代码性能更高,官方提供了一个能够体现出来这种优势的插图,如下

相关阅读

  • d780expeed相关文章最新报道尼康 尼康j5
  • expeed IT support cloud services and web hosting
  • 内存使用相关文章最新报道