delegate 的 wek 和 strong 引起的问题

2015-10-30 09:27:24 +08:00
 laobaozi

先上代码

#import "BaseRequest.h"

@protocol RequestDelegate <NSObject>

@optional
-(void)ReturnRequestData:(NSArray *)dataArray;

@end

@interface GetRequest : BaseRequest

-(int)Get:(NSString *)goalUrl;

@property (nonatomic, weak) id <RequestDelegate> getDelegate;
@end

在 m 中

if ([_getDelegate respondsToSelector:@selector(ReturnRequestData:)]) {
[_getDelegate ReturnRequestData:array];
}

问题在 当这个 getDelegate 对象为 wek 时,不能响应方法,而为 strong 时则没有问题.
但是在别的地方使用代理时将 delegate 设为 weak 又没问题,这个 why?

2699 次点击
所在节点    iDev
8 条回复
ashamp
2015-10-30 09:30:31 +08:00
delegate 没有持有 BaseRequest 吧?
request 出了作用于被立即释放了
lxian2
2015-10-30 09:49:58 +08:00
想吐槽下一个 property 为什么要叫 getDelegate
laobaozi
2015-10-30 10:30:58 +08:00
@ashamp 是的 是对象被清楚了,还在查是哪儿被清除了
@lxian2 这个 http 请求的 get 类 所有就叫 getDelegate 了..
matsuijurina
2015-10-30 10:50:27 +08:00
我猜十有八九楼主在.m 文件里调用 delegate 指定方法的代码是放在一个 block 里面的。而在你的代码里直接使用了 self. 这时候就出现循环引用的问题了, block 会 retain self , self 又会 retain block 。 解决的方法有很多种,最直接的就是先利用 __weak 把 self 转成 weakSelf ,在 block 内部需要使用 self 的地方都换成 weakSelf ,这样就没有问题了。
matsuijurina
2015-10-30 11:14:42 +08:00
还有一个办法是你直接在 block 的外面加一行代码

id tempGetDelegate = self.getDelegate;

然后把 block 内的代码里替换为
if ([tempGetDelegate respondsToSelector:@selector(ReturnRequestData:)]) {
[tempGetDelegate ReturnRequestData:array];
}


这样也可以。这种情况下 self 会 retain block , block retain delegate ,就没有循环引用了。
loveuqian
2015-10-30 12:25:45 +08:00
我在 m 里面是用 get 方法去拿代理的,不是用下划线成员变量
if ([self.getDelegate respondsToSelector:@selector(ReturnRequestData:)])
{
[self.getDelegate ReturnRequestData:array];
}
laobaozi
2015-10-30 13:24:50 +08:00
@matsuijurina 是的 我的确的放在了 NSURLSessionTask 的回调里面,造成了循环引用
谢谢你指导
lcl22hope
2015-10-31 18:28:41 +08:00
因为你的 delegate 没有实例化,_getDelegate 是 nil ,两点原因: 1.需要实现代理协议的地方没有实现代理,比如类似 tableView.delegate = self 这种。 2.方法本身没有对 delegate ,调用 setDelegate

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/232181

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX