————weak 和————block

Blocks理解:

Blocks可以访问局部变量,但是不能修改

如果修改局部变量,需要加__block

 __block int multiplier = 7;
     int (^myBlock)(int) = ^(int num) {
         multiplier ++;//这样就可以了
         return num * multiplier;
     };

2、如果局部变量是数组或者指针的时候只复制这个指针,两个指针指向同一个地址,block只修改指针上的内容。如:

NSMutableArray *mArray = [NSMutableArray arrayWithObjects:@"a",@"b",@"abc",nil];
    NSMutableArray *mArrayCount = [NSMutableArray arrayWithCapacity:1];
    [mArray enumerateObjectsWithOptions:NSEnumerationConcurrent usingBlock: ^(id obj,NSUInteger idx, BOOL *stop){
        [mArrayCount addObject:[NSNumber numberWithInt:[obj length]]];
    }];

    NSLog(@"%@",mArrayCount);

例子里面确实没有修改mArrayCount这个局部变量啊。mArrayCount是一个指针,指向一个可变长度的数组。在block里面,并没有修改这个指针,而是修改了这个指针指向的数组。换句话说,mArrayCount是一个整数,保存的是一块内存区域的地址,在block里,并没有改变这个地址,而是读取出这个地址,然后去操作这块地址空间的内容。

这是允许的,因为声明block的时候实际上是把当时的临时变量又复制了一份,在block里即使修改了这些复制的变量,也不影响外面的原始变量。即所谓的闭包。

但是当变量是一个指针的时候,block里只是复制了一份这个指针,两个指针指向同一个地址。所以,在block里面对指针指向内容做的修改,在block外面也一样生效。

__weak __typeof(&*self)weakSelf =self; 等同于

__weak UIViewController *weakSelf =self;

为什么不用__block 是因为通过引用来访问self的实例变量 ,self被retain,block也是一个强引用,引起循环引用,用__week是弱引用,当self释放时,weakSelf已经等于nil。

扩展:NSTimer注意避免循环引用的地方,需要找个合适的时机和地方来 invalidate timer

在引用计数的环境里面,默认情况下当你在block里面引用一个Objective-C对象的时候,该对象会被retain。当你简单的引用了一个对象的实例变量时,它同样被retain。但是被__block存储类型修饰符标记的对象变量不会被retain

注意:在垃圾回收机制里面,如果你同时使用__weak和__block来标识一个变量,那么该block将不会保证它是一直是有效的。 如果你在实现方法的时候使用了block,对象的内存管理规则更微妙:也是(__weak与__block区别:)

1、如果你通过引用来访问一个实例变量,self会被retain。
2、如果你通过值来访问一个实例变量,那么变量会被retain

时间: 2024-10-11 21:12:53

————weak 和————block的相关文章

IOS开发--循环引用问题,普通控件为什么用weak,代理为什么用weak,block内用到外面的东

所有的引用计数系统,都存在循环应用的问题. 例如下面的引用关系对象: a创建并引用到了对象b. 对象b创建并引用到了对象c. 对象c创建并引用到了对象b. 这时候b和c的引用计数分别是2和1.当a不再使用b,调用release释放对b的所有权,因为c还引用了b,所以b的引用计数为1,b不会被释放.b不释放,c的引用计数就是1,c也不会被释放.从此,b和c永远留在内存中,造成内存浪费.这种情况,必须打断循环引用,通过其他规则来维护引用关系. 那么普通控件为什么要用weak: 如下图控制器中的Vie

iOS中Block的基础用法

本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道Block的精妙之处. Block简介 Block是一种比较特殊的数据类型.它可以保存一段代码,在合适的时候取出来调用. Block的修饰 ARC情况下1.如果用copy修饰Block,该Block就会存储在堆空间.则会对Block的内部对象进行强引用,导致循环引用.内存无法释放.解决方法:新建一个

[HMLY]10.iOS中block的基础用法

本文简介 本章不会对Block做过多的实现研究.只是讲解基本的用法.纯粹基础知识.结合实际项目怎么去做举例.Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等.用过GCD就知道Block的精妙之处. Block简介 Block是一种比较特殊的数据类型.它可以保存一段代码,在合适的时候取出来调用. Block的修饰 ARC情况下1.如果用copy修饰Block,该Block就会存储在堆空间.则会对Block的内部对象进行强引用,导致循环引用.内存无法释放.解决方法:新建一个

block里的self、weakSelf、strongSelf

转自  http://www.cnblogs.com/zhang-chi/p/5532272.html ARC下,关于block里面使用self.weakSelf.strongSelf,理解一直没有特别的透彻,今天花时间研究了一下,总结如下: 其实一共就涉及到两个问题: 1.是否循环引用了 2.block里面的代码,不一定执行到哪行时,VC可能就释放了,self就为nil了,那么你到底想让代码在这种情况下如何执行. 其实到底用self.weakSelf还是strongSelf,就是上面两个问题的

Delegate,Block,Notification, KVC,KVO,Target-Action

Target-Action: 目标-动作机制,所有的UIControl及子类都是这个机制:原理:在对象产生某个事件的特定时刻,给一个对象发送一个消息:类内部target去执行action方法 Delegate:  iOS2.0以后出现,delegate配合protocol,delegate 是一对一的关系,修饰符使用weak, 当 Block: iOS4.0以后出现,一对一 Notification: 一对多, KVC: 键值编码,即是指 NSKeyValueCoding,一个非正式的Proto

block的内存分析,循环引用,变量访问,数据结构定义

一.block的内存分析 如上图: 定义了一个weak的block,那么它在内存中的表现形式如右下角, 1.没有对block进行copy操作,而是weak,block就存储在栈空间中. 2.如果block存储于栈空间,不会对block内部所用到的对象产生强引用. 如上图: 对block进行了一次copy操作,如果对block进行copy操作,block就会存储到堆空间当中. 1.如果block存储于堆空间,就会对block内部所用到的对象产生强引用. 2.如下图所示,就会产生循环引用,造成P对象

Objective-C 基础之— Block本质+源码剖析

block 又称之为"自带变量的匿名函数",抛开OC语法定义block的形式不谈,其实好多语言都有类似的函数,比如JS的回调函数(其实就是将一个匿名还是作为函数的实参).swift的闭包等等.. 首先讲一下oc block的实质,通过自身的理解,加以各位大神的剖析文章.block 在编译时期会被编译成结构体,也就是说OC的block底层是使用C语言结构体实现的, 和对象.类的实现是一样的(所以其实block就是OC中的一个对象),这个结构体包括两个结构体成员变量和一个构造函数,我们都知

IOS近期公司的面试题

1. 怎么修改只读(readonly)属性变量 使用KVC可以修改 kvc就是键值编码(key-value),可以通过指定的key获得想要的值value,而不是通过调用 Setter,Getter 方法访问 2.KVO 除了能观察属性外,能不能观察对象 不能观察对象 KVO,即 Key-Value Observing, 它提供一种机制,当指定的对象的属性被修改后,则对象就会接受到通知.简单的说就是每次指定的被观察者的对象的属性被修改后,KVO就会自动通知相应的观察者了 KVO是一个对象能过观察另

iOS-旧项目中手动内存管理(MRC)转ARC

在ARC之前,iOS内存管理无论对资深级还是菜鸟级开发者来说都是一件很头疼的事.我参 加过几个使用手动内存管理的项目,印象最深刻的是一个地图类应用,由于应用本身就非常耗内存,当时为了解决内存泄露问题,每周都安排有人值班用 Instruments挨个跑功能,关键是每次都总能检查出来不少.其实不管是菜鸟级还是资深级开发者都避免不了写出内存泄露的代码,规则大家都懂,可是 天知道什么时候手一抖就少写了个release? 好在项目决定转成ARC了,下面将自己转换的过程和中间遇到的问题写出来和大家共享,希望