使用容器的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的用法的更多相关文章

  1. 八.OC基础加强--1.autorelease的用法 2.ARC下内存管理 3.分类(category)4.block的学习

    1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用auto ...

  2. 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(@"弱引 ...

  3. __weak、__strong这样的关键词和weak、strong有哪些区别

    ios4 设备上最好就不要使用 ARC... strong,weak 用来修饰属性.strong 用来修饰强引用的属性:@property (strong) SomeClass * aObject;  ...

  4. iOS开发-多层嵌套block中如何使用__weak和__strong

    1.关于__weak__weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等)__weak修饰的对象在block中不可以被重新赋值.__weak ...

  5. iOS基本内存管理:autorelease和autoreleasepool

    1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自 ...

  6. autorelease注意事项

    1.autorelease使用注意 并不是放到自动释放池代码中,都会自动加入到自动释放池 @autoreleasepool { // 因为没有调用 autorelease 方法,所以对象没有加入到自动 ...

  7. iOS开发ARC内存管理技术要点

    本文来源于我个人的ARC学习笔记,旨在通过简明扼要的方式总结出iOS开发中ARC(Automatic Reference Counting,自动引用计数)内存管理技术的要点,所以不会涉及全部细节.这篇 ...

  8. iOS----ARC(自动内存管理)

    1.ARC是什么呢,有什么用? ARC是苹果官方推出的帮助我们苹果开发工程师管理内存的一种自动内存管理机制,它的前身是MRC,也就是手动内存管理: 2.ARC的基本原理是什么? ARC是编译器(时)特 ...

  9. iOS-ARC

    1. 本文的主要内容: ARC的本质 ARC的开启与关闭 ARC的修饰符 ARC与Block ARC与Toll-Free Bridging ARC的本质 ARC是编译器(时)特性,而不是运行时特性,更 ...

随机推荐

  1. 一张图看懂------left join;right join;inner join

  2. python paramiko 调试

    #!/usr/bin/env python #-*- encoding:utf-8 -*- import paramiko transport = paramiko.Transport(('10.34 ...

  3. The R Project for Statistical Computing

    [Home] Download CRAN R Project About R Contributors What’s New? Mailing Lists Bug Tracking Conferenc ...

  4. JavaScript实现重置表单(reset)的方法

    转自:https://www.jb51.net/article/63305.htm <!DOCTYPE html> <html> <head> <script ...

  5. C语言学习笔记--数组参数和指针参数

    1. 数组参数退化为指针的意义 (1)C 语言中只会以值拷贝的方式传递参数,当向函数传递数组时,将整个数组拷贝一份传入函数导致执行效率低下,C 语言以高效作是最初的设计目标,所以这种方法是不可取的. ...

  6. Android中同一个ImageView中根据状态显示不同图片

    一般: if(条件1) { image.setBackground(R.id.xxx1); } else if (条件2) { image.setBackground(R.id.xxx2); } 实际 ...

  7. springmvc urlpattern配置详解

    静态资源无法访问问题的解决方案: 1.使用Tomcat默认的Servlet解决:在web.xml中加以下代码

  8. c++对象模型探索(一)

    粗略阅读了<深度探索c++对象模型>一书后,对c++对象底层的内存布局有了一些了解,但同时,也产生了一些疑惑: 1.将子类指针用dynamic_cast转成父类指针之后,其虚表指针会相应变 ...

  9. WINFORM 无边框窗体 阴影与移动

    //窗体移动API[DllImport("user32.dll")]public static extern bool ReleaseCapture();[DllImport(&q ...

  10. Opencv Laplacian(拉普拉斯算子)

    #include <iostream>#include <opencv2/opencv.hpp>#include <math.h> using namespace ...