__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

//输出
2014-11-01 19:40:34.480 AutoRelease[4506:60b] str addr is 0x8f32890
2014-11-01 19:40:34.480 AutoRelease[4506:60b] reference addr is 0x8f32890
2014-11-01 19:40:34.480 AutoRelease[4506:60b] reference addr is 0x0
2014-11-01 19:40:34.481 AutoRelease[4506:60b] view will appear reference :(null)
2014-11-01 19:40:34.486 AutoRelease[4506: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
//输出
2014-11-01 19:41:20.872 AutoRelease[4669:60b] str addr is 0x8d42dd0
2014-11-01 19:41:20.872 AutoRelease[4669:60b] reference addr is 0x8d42dd0
2014-11-01 19:41:20.873 AutoRelease[4669:60b] reference addr is 0x8d42dd0
2014-11-01 19:41:20.873 AutoRelease[4669:60b] view will appear reference :xxxxx
2014-11-01 19:41:20.877 AutoRelease[4669:60b] viewDidAppear reference: xxxxx
时间: 2024-10-11 15:18:10

__weak 和 __strong 还有Autorelease的用法的相关文章

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

1.autorelease的用法   1.自动释放池及autorelease介绍 (1)在iOS程序运行过程中,会创建无数个池子,这些池子都是以栈结构(先进后出)存在的. (2)当一个对象调用autorelease时,会将这个对象放到位于栈顶的释放池中 . 2.为什么会有autorelease? OC的内存管理机制中比较重要的一条规律是:谁申请,谁释放. 但有些情况下,开发者并不能确定某些对象何时释放.这时候就需要自动释放池. 它的好处是: (1)不需要再关心对象释放的时间 : (2)不需要再关

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

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

关于__weak 和 __strong配和使用的原因

之前,看到关于blcok外使用__weak弱化对象,blcok内再用 __strong 强引用的原因: 保证对象在blcok中不会被提前释放,当blcok执行完之后,自动释放该对象. 今天看了一下__weak修饰的对象,在被使用的时候,每次使用都会被注册到autoreleasepool中,例如: { id __weak o = obj; NSLog(@"%@",obj); NSLog(@"%@",obj); NSLog(@"%@",obj); N

ios的__weak、__strong关键字

这个是针对arc来说的 __weak是弱引用 __strong是强引用 官方的说明如下 __strong is the default. An object remains “alive” as long as there is a strong pointer to it. 强引用是默认的,对象像强指针一样持久的存在 __weak specifies a reference that does not keep the referenced object alive. A weak refer

block 中使用__weak 和__strong修饰符的问题

在ARC环境下,我们常常会使用weak 的修饰符来修饰一个变量,防止其在block中被循环引用,但是有些特殊情况下,我们在block中又使用strong 来修饰这个在block外刚刚用__weak修饰的变量,为什么会有这样奇怪的写法呢? 后来上网查资料,给的解释就是下面的这段话: 在block中调用self会引起循环引用,但是在block中需要对weakSelf进行 strong,保证代码在执行到block中,self不会被释放,当block执行完后, 会自动释放该strongSelf: 对于程

oc __weak和__strong的区别

1.先上代码 id __weak obj=[[NSObject alloc]init]; NSLog(@"弱引用自身地址:%p",&obj); NSLog(@"弱引用指向地址:%p",obj); id __strong obj0=[[NSObject alloc]init]; id __weak obj1=obj0; NSLog(@"强引用自身地址:%p",&obj0); NSLog(@"弱引用自身地址:%p"

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

1.关于__weak__weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等)__weak修饰的对象在block中不可以被重新赋值.__weak只在ARC下使用,可以避免循环引用.__weak修饰对象不会增加引用 __weak __typeof(self) weakSelf = self; self.testBlock = ^{ [weakSelf doSomeThing]; }); 弱引用不会影响对象的释放,但是当对象被释放时,所有指向它

iOS基本内存管理:autorelease和autoreleasepool

1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自身引用计数器不会改变,而且会返回对象本身 2.autorelease 的优点 autorelease实际上只是把对release的调用延迟了,对于每一次autorelease系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Relea

autorelease方法

1.autorelease 基本用法 对象执行autorelease方法时会将对象添加到自动释放池中 当自动释放池销毁时自动释放池中所有对象作release操作 对象执行autorelease方法后自身引用计数器不会改变,而且会返回对象本身 2.autorelease 的优点 autorelease实际上只是把对release的调用延迟了,对于每一次autorelease系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用Relea