百度地图API里retain cycle的疑问
morpheus1984公司项目里有个定位的功能,决定采用百度地图API来做这个。然后看demo的时候发现一个奇怪的地方:@property (nonatomic, retain) id<BMKMapViewDelegate> delegate;
不太明白为什么这里的delegate要用retain 虽然在注释里也说明了
"/// 地图View的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放
"
我想问下有木有哪位大神这么用过?为什么要这么用呢?什么样的情况下这么用,释放的时候注意哪些才能不内存泄露。拜托了。@tinyfool,@sycx老师有空的话也来看看吧。
上面这个属性是在BMKMapView这个类里面的
不是说delegate就一定要用assign修饰的,这个看情况,有时候基于一些特殊原因delegate也是需要retain。比如官方的NSURLConnection就是一个典型retain了delegate的例子
的确不明白他为啥要设计为retain,我觉得这里完全可以使用assign就可以了。 这里用retain简直就是专门给开发者找麻烦。。。
我觉得这里用retain应该属于设计失误,或者手滑写错...
用retain的话.... 想想都觉着用起来绝对很受罪...
相信就是这么设计的,总不能理解成百度工程师垃圾不知道delegate用assign吧。一楼楼长说" 有时候基于一些特殊原因delegate也是需要retain。比如官方的NSURLConnection就是一个典型retain了delegate的例子"我在想如果真是这样,那是什么样的特殊原因呢?@sycx @btxkenshin @terryso @tinyfool 各位大神 你们怎么看?
@morpheus198 我看不到NSURLConnection哪里用了retain的delegate?
@terryso 我在文档里看到了这么一句话:"Note: During a download the connection maintains a strong reference to the delegate. It releases that strong reference when the connection finishes loading, fails, or is canceled."
@morpheus198 嗯,我试验了一下,NSURLConnection的确是会retain它的delegate。不过我想那是因为,NSURLConnection没有一个delegate属性,你必须通过初始化方法把delegate对象传进去,这样NSURLConnection自己就必须retain delegate留来自己用,并且NSURLConnection在请求结束之后,它会自己release它的delegate,这样调用方就不用自己release。 而BMKMapView是有一个delegate属性的,加了retain就会有可能导致retain cycle问题,搞得调用方很麻烦。
这是我的理解,不知道是否正确,请各位大神拍砖。。。
GPS定位跟网络下载地图信息都是异步的,用assign可能会遇到调用者提前释放导致crash。