__weak 和 __strong 还有Autorelease的用法
使用容器的block版本的枚举器时,内部会自动添加一个AutoreleasePool:
Autorelease对象是在当前的runloop迭代结束时释放的,而它能够释放的原因是系统在每个runloop迭代中都加入了自动释放池Push和Pop
当然,在普通for循环和for in循环中没有,所以,还是新版的block版本枚举器更加方便。for循环中遍历产生大量autorelease变量时,就需要手加局部AutoreleasePool咯。
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
// 这里被一个局部@autoreleasepool包围着
}];
weak 和 strong 是iOS用于释放对象的一种机制,weak声明的对象,在原指针被释放之后,也会被会释放变成nil;
下面给出__weak和带__strong的代码和输出
@implementation AutoReleaseViewController __weak id reference;
- (void)viewDidLoad
{
[super viewDidLoad];
@autoreleasepool {
NSString * str = [NSString stringWithFormat:@"xxxxx"];
reference = str;
NSLog(@"str addr is %p",str);
NSLog(@"reference addr is %p",reference); }
} -(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"reference addr is %p",reference);
NSLog(@"view will appear reference :%@", reference);
} -(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear reference: %@",reference);
}
@end //输出
-- ::34.480 AutoRelease[:60b] str addr is 0x8f32890
-- ::34.480 AutoRelease[:60b] reference addr is 0x8f32890
-- ::34.480 AutoRelease[:60b] reference addr is 0x0
-- ::34.481 AutoRelease[:60b] view will appear reference :(null)
-- ::34.486 AutoRelease[:60b] viewDidAppear reference: (null)
@implementation AutoReleaseViewController __strong id reference;
- (void)viewDidLoad
{
[super viewDidLoad];
@autoreleasepool {
NSString * str = [NSString stringWithFormat:@"xxxxx"];
reference = str;
NSLog(@"str addr is %p",str);
NSLog(@"reference addr is %p",reference); }
} -(void)viewWillAppear:(BOOL)animated{
[super viewWillAppear:animated];
NSLog(@"reference addr is %p",reference);
NSLog(@"view will appear reference :%@", reference);
} -(void)viewDidAppear:(BOOL)animated{
[super viewDidAppear:animated];
NSLog(@"viewDidAppear reference: %@",reference);
}
@end
//输出
-- ::20.872 AutoRelease[:60b] str addr is 0x8d42dd0
-- ::20.872 AutoRelease[:60b] reference addr is 0x8d42dd0
-- ::20.873 AutoRelease[:60b] reference addr is 0x8d42dd0
-- ::20.873 AutoRelease[:60b] view will appear reference :xxxxx
-- ::20.877 AutoRelease[:60b] viewDidAppear reference: xxxxx
__weak 和 __strong 还有Autorelease的用法的更多相关文章
- 八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习
1.autorelease的用法 1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用auto ...
- oc __weak和__strong的区别
1.先上代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 id __weak obj=[[NSObject alloc]init]; NSLog(@"弱引 ...
- __weak、__strong这样的关键词和weak、strong有哪些区别
ios4 设备上最好就不要使用 ARC... strong,weak 用来修饰属性.strong 用来修饰强引用的属性:@property (strong) SomeClass * aObject; ...
- iOS开发-多层嵌套block中如何使用__weak和__strong
1.关于__weak__weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等)__weak修饰的对象在block中不可以被重新赋值.__weak ...
- iOS基本内存管理:autorelease和autoreleasepool
1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...
- autorelease注意事项
1.autorelease使用注意 并不是放到自动释放池代码中,都会自动加入到自动释放池 @autoreleasepool { // 因为没有调用 autorelease 方法,所以对象没有加入到自动 ...
- iOS开发ARC内存管理技术要点
本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...
- iOS----ARC(自动内存管理)
1.ARC是什么呢,有什么用? ARC是苹果官方推出的帮助我们苹果开发工程师管理内存的一种自动内存管理机制,它的前身是MRC,也就是手动内存管理: 2.ARC的基本原理是什么? ARC是编译器(时)特 ...
- iOS-ARC
1. 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更 ...
随机推荐
- 初识Vue练习
<html lang="en"> <head> <meta charset="UTF-8"> <title>Ti ...
- MySQL学习笔记之一---字符编码和字符集
前言: 一般来说,出现中文乱码,都是客户端和服务端字符集不匹配导致的原因. (默认未指定字符集创建的数据库表,都是latinl字符集, 强烈建议使用utf8字符集) 保证不出现乱码的思想:保证客户 ...
- 9-EasyNetQ之基于主题的路由
RabbitMQ有一个很酷的功能,基于主题的路由,这个功能允许订阅者基于多个条件去过滤消息.一个主题是由点号分隔的单词列表,随消息一同发布.例如:"stock.usd.nyse" ...
- python的程序书写以及保存
在前面的微博里已经叙述Python的安装以及路径的设置. 在我们的windows的电脑上面我们已经安装完了python以及设置了它的路径,所以我们可以再cmd里面进行Python的编写(cmd的快速打 ...
- linux驱动开发的经典书籍
转载于:http://www.cnblogs.com/xmphoenix/archive/2012/03/27/2420044.html 参加实习也近一个月了,严重感觉知识不够,真是后悔学校里浪费那么 ...
- LINUX 使用DBCA创建ORACLE数据库
- MyBatis总结二:增删改查
上一篇讲述了MyBatis的快速入门,下面在此基础上进行增删改查的操作: 首先定义dao层的接口: package com.zy.dao; import com.zy.domain.User; imp ...
- jqgrid列动态加载
private void InitGrid(string entityName) { Session["entityName"] = entityName; ArrayList c ...
- svn跨多个版本比较
由于一些原因某个路径下的 svn revision 不是连续的,在比对时需要跨多个版本进行比较,使用下面步骤 Show_log -> 按住 ctrl 键选择不同版本 -> 右键 -> ...
- MySQL安装与管理
数据库服务器.数据库和表的关系 –所谓安装数据库服务器,只是在机器上装了一个数据库管理程序,这个管理程序可以管理多个数据库,一般开发人员会针对每一个应用创建一个数据库. –为保存应用中实体的数据,一般 ...