Code Bye

在使用Block的时候,当传入的参数是一个id对象的时候,提示需要id转换的问题。

当时使用block调用的时候传入的参数如果是id类型的对象的时候会报错,提示如下:
/Users/limingyang/Desktop/iPadCurrentItem3/SD4iPad/Classes/Model/DataCenter.m:1856:24: Implicit conversion of an Objective-C pointer to “”__autoreleasing id *”” is disallowed with ARC
在网上查了一下需要用到__bridge_retained ,__bridge,或者是__bridge_transfer来强制转换。

用法如下:
 __bridge只做类型转换,但是不修改对象内存)管理权;

__bridge_retained(也可以使用CFBridgingRetain)将Objective-C的对象转换为Core Foundation的对象,同时将对象(内存)的管理权交给我们,后续需要使用CFRelease或者相关方法来释放对象

__bridge_transfer(也可以使用CFBridgingRelease)将Core Foundation的对象转换为Objective-C的对象,同时将对象(内存)的管理权交给ARC。

问题是我想让大家分析一下一个对象存在的生命周期。
比如我想在A类里调用B类的方法。被调用的B类的方法中传的是一个(void)(^callBack)(id *result,id *signInfo) completion。那请问一下。那我想知道正常情况下result的生命周期是什么时候结束?

本帖最后由 zhangao0086 于 2015-03-30 11:14:25 编辑

你是在A类调用的B类设置Block的方法,那result和signInfo在B类传递给A类后就结束了。
伪代码:

// A类
- (void)aMethod {  // A中的方法
        b.setCallBack:^(id *result, id *signInfo) {
                
        }
}
// B类
- (void)bMethod {  // B中的方法
        id *result;
        id *signInfo;
        self. callBack(result, signInfo);
}  // result和signInfo被释放

如果你是在Block闭包内截获外部的一个指针,指针在OC和Swift的Block里被截获时是不会强引用的,那它们的生命周期,就取决于外部。


10分
在oc中id类型本身就是一个指针,你定义的block的参数 id *result,传递的就是指针的指针。block其实是匿名的函数块,block中参数的生命周期在传递结束后就已经结束。其实更值得讨论的是block的生命周期是怎么样的。
引用 2 楼 zhanglei5415 的回复:

在oc中id类型本身就是一个指针,你定义的block的参数 id *result,传递的就是指针的指针。block其实是匿名的函数块,block中参数的生命周期在传递结束后就已经结束。其实更值得讨论的是block的生命周期是怎么样的。

如果是堆block,则生命周期和一个普通对象无异
如果是栈block,则在方法结束,出栈的时候释放
如果是全局block,则相关于静态变量


10分
引用 3 楼 zhangao0086 的回复:
Quote: 引用 2 楼 zhanglei5415 的回复:

在oc中id类型本身就是一个指针,你定义的block的参数 id *result,传递的就是指针的指针。block其实是匿名的函数块,block中参数的生命周期在传递结束后就已经结束。其实更值得讨论的是block的生命周期是怎么样的。

如果是堆block,则生命周期和一个普通对象无异
如果是栈block,则在方法结束,出栈的时候释放
如果是全局block,则相关于静态变量

嗯,总结的很全。

嗯。谢谢啦。

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明在使用Block的时候,当传入的参数是一个id对象的时候,提示需要id转换的问题。