`
JavaZhuang
  • 浏览: 9549 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

4 7.OC13-内存管理4-autorelease

    博客分类:
  • IOS
 
阅读更多

4 7.OC13-内存管理4-autorelease

 

 

自动释放池(autorelease  pool

1)、自动释放池是OC里面的一种内存自动回收机制,一般可以将一些临时变量添加到自动释放池中,统一回收释放。

2)、当自动释放池销毁时,池里面的所有对象都会调用一次release方法。

 

autorelease

1)OC对象只需要发送一条autorelease消息,就会把这个对象添加到最近的自动释放池中(栈顶的释放池)

2)autorelease实际上只是把对release的调用延迟了,对于每一次autorelease,系统只是把该对象放入了当前的autorelease  pool中,当该pool被释放时,该pool中的所有对象会被调用release

 

使用autorelease

以前

Book  *book = [[Book  alloc] init];

[student  setBook:book];

[book  release];

 

现在:

Book  *book = [ [[Book  alloc]  init]   autorelease];

[student  setBook:book];

//不要在调用[book  release];

 

 

autorelease  pool疑问

1)、在iphone项目中,main()中有一个默认的Autorelease  Pool,程序开始时创建,程序退时销毁,按照对Autorelease的理解,岂不是Autorelease  Pool里的所有对象在程序退出时才release,这样跟内存泄露有什么区别?

2)、对于每一个Runloop,系统会隐式创建一个Autorelease  pool,并且把创建好的pool放在栈顶,所有的pool会构成一个栈式结构。在每一个Runloop结束时,当前栈顶的pool会被销毁,这样这个pool里的每个对象会执行release操作。

 

 

 

 

例一:

main.m

 //

//  main.m

//  OC10-内存管理2-set方法的内存管理

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

#import "Student.h"

 

 

int main(int argc, const char * argv[])

{

    //@@autoreleasepool代表创建一个自动的释放池

    @autoreleasepool {

        Student *stu = [[[Student alloc] init] autorelease];

        

        Student *stu1 = [[[Student alloc] init] autorelease];

    

        //这个str是自动释放的,不需要释放

        Student *stu2 = [Student student];

        

        //这个str是自动释放的,不需要释放

        NSString *str = [NSString stringWithFormat:@"age is %i", 10];

    }

    return 0;

}

 

 

Student.h

 //

//  Student.h

//  OC10-内存管理2-set方法的内存管理

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import <Foundation/Foundation.h>

 

@interface Student : NSObject

 

+ (id)student;

 

@end

 

 

Student.m

 //

//  Student.m

//  OC10-内存管理2-set方法的内存管理

//

//  Created by qwz on 13-12-9.

//  Copyright (c) 2013 renhe. All rights reserved.

//

 

#import "Student.h"

 

@implementation Student

 

- (void)dealloc{

    NSLog(@"%@被销毁", self);

    [super dealloc];

}

 

+ (id)student{

    Student *stu = [[[Student alloc] init] autorelease];

}

 

@end

 

 

分享到:
评论

相关推荐

    Node.js-mysql-autoRelease:node.js mysql事务自动释放连接

    Node.js-mysql-autoRelease node.js mysql transaction Auto Release connection\ 实现Node.js中连接池自动回收连接功能

    前端开源库-node-circleci-autorelease

    前端开源库-node-circleci-autorelease节点circleci autorelease,在circleci上创建释放标记

    02-内存管理1

    1&gt; 系统自带的绝大数类方法返回的对象,都是经过autorelease的4.block在ARC中和MRC中的用法有什么区别,需要注意什么1.对于没有引用外部变量

    autorelease-github:通过 GitHub API 为您的构建管道自动发布

    autorelease-github 通过 GitHub API 为您的构建管道自动发布 这是一个非常简单的项目,它需要 N 个文件并使用 bash、curl 和 jq 通过上传它们。 它旨在成为构建管道中的嵌入式发布构建。 输入是一堆文件和一个放...

    iOS多线程编程指南

    第二章 线程管理 .................................................................................................................................... 13 2.1 线程成本......................................

    IOS高级内存管理编程指南.pdf

    介绍IOS内存管理的一本电子书,初学者可以很快的了解ios上的内存管理的机制,有一定经验的也可以从中得到新的收获。

    IOS入门之HelloWorld源代码

    autorelease]; self.window.backgroundColor = [UIColor whiteColor]; [self.window makeKeyAndVisible]; UILabel *label = [[UILabel alloc] initWithFrame:CGRectMake(320/2.0 - 140/2.0, 80, 140, 40)]; /...

    在非ARC环境下的内存管理

    这是一个简单的内存管理的示例,在非ARC的环境下,如何管理内存

    ios开发小技巧

    NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}"; NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailRegex]; return [emailTest ...

    详解iOS应用开发中的ARC内存管理方式

    你不再需要担心内存管理,因为编译器为你处理了一切 注意:ARC 是编译器特性,而不是 iOS 运行时特性(除了weak指针系统),它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加...

    Programming in Objective-C 4th Edition

    Object References and the Autorelease Pool 403 The Event Loop and Memory Allocation 405 Summary of Manual Memory Management Rules 407 Automatic Reference Counting (ARC) 408 Strong Variables 408 Weak ...

    object-c基础教程

    大纲  开始吧 ... 内存管理 o Retain and Release(保留与释放) o Dealloc o Autorelease Pool  Foundation Framework Classes o NSArray o NSDictionary  优点与缺点  更多信息

    mulle-clang::ID_button:用于mulle-objc的Objective-C编译器

    mulle-clang 这是一个基于clang 10.0.0的Objective-C编译器,是为运行时编写的。 它对应于mulle-objc-runtime v0.17或更高版本。 有关的更多信息,请... 您不能执行显式的内存管理(如-dealloc , -autorelease ,

    弹出框的运用

    PoPoverViewController * popover = [[[PoPoverViewController alloc]initWithNibName:@"PoPoverViewController" bundle:nil] autorelease]; popover.mainViewController = self; UIPopoverController * pcr = [...

    Objective-c对象组装XML

    -tag 1- 测试无内存泄露 1 创建数据对象() NSMutableDictionary *map = [[NSMutableDictionary alloc]init]; [map setObject:@"a" forKey:@"author"]; [map setObject:@"b" forKey:@"title"]; [map set...

    Google Objective-C Style Guide 中文版

    创建对象时尽量使用autorelease Autorelease之后retain Dealloc中应该按声明的顺序处理成员变量 Setters中对NSString进行copy 避免抛出异常 nil的检查 BOOL陷阱 属性 Cocoa模式 委托模式 模型-视图-控制器

    AutoReleaseTool:自动部署桌面应用程序的CICD工具

    使用之前的Nuget包打开NuGet包资源管理器更新版本替换发行文件保存新的Nuget软件包版本在Visual Studio中运行程序包管理器控制台以创建新版本AutoReleaseTool负责上述所有步骤,并在内部使用Squirrel.exe。...

    Objective-C学习之ARC的实现方法

    在Xcode 4.2中,除了语法检查外,Apple的新LLVM编译器还将内存管理的苦差事接了过来,它会检查代码,决定何时释放对象。Apple的文档里是这么定义ARC的: “自动引用计数(ARC)是一个编译器级的功能,它能简化Cocoa应用...

    Objective C Memory Management Essentials(PACKT,2015)

    You will begin with a basic understanding of memory management, and why memory leaks occur in an application, moving on to autorelease pools and object creation/storage to get an idea of how memory ...

    iOS 5 ARC完全指南

    iOS 5 ARC完全指南中文 ...iOS 4 中使用ARC 27 ARC 高级指南 28 Blocks 与ARC 28 Singleton 与ARC 34 Autorelease 和AutoreleasePool 40 Cocos2D 和 Box2D 45 静态库static library 48 最后? 49 参考资料 49

Global site tag (gtag.js) - Google Analytics