OC

Knowledge OS
登录 注册
全部话题 移民 创业 iOS Mac Objective-C Swift Android 招聘 求职

百度地图API里retain cycle的疑问

morpheus1984
morpheus1984 发布于 2013年08月19日 | 更新于 2013年08月22日
无人欣赏。

公司项目里有个定位的功能,决定采用百度地图API来做这个。然后看demo的时候发现一个奇怪的地方:@property (nonatomic, retain) id<BMKMapViewDelegate> delegate; 不太明白为什么这里的delegate要用retain 虽然在注释里也说明了 "/// 地图View的Delegate,此处记得不用的时候需要置nil,否则影响内存的释放 " 我想问下有木有哪位大神这么用过?为什么要这么用呢?什么样的情况下这么用,释放的时候注意哪些才能不内存泄露。拜托了。@tinyfool,@sycx老师有空的话也来看看吧。 上面这个属性是在BMKMapView这个类里面的

共21条回复
楼长 ·
btxkenshin 回复于 2013年08月19日

不是说delegate就一定要用assign修饰的,这个看情况,有时候基于一些特殊原因delegate也是需要retain。比如官方的NSURLConnection就是一个典型retain了delegate的例子

2楼 ·
terryso 回复于 2013年08月19日

的确不明白他为啥要设计为retain,我觉得这里完全可以使用assign就可以了。 这里用retain简直就是专门给开发者找麻烦。。。

3楼 ·
sycx 回复于 2013年08月19日

我觉得这里用retain应该属于设计失误,或者手滑写错...

用retain的话.... 想想都觉着用起来绝对很受罪...

4楼 ·
terryso 回复于 2013年08月19日

@sycx 我看了头文件,好多地方的delegate都retain,应该不是错手

5楼 ·
morpheus1984 回复于 2013年08月19日

相信就是这么设计的,总不能理解成百度工程师垃圾不知道delegate用assign吧。一楼楼长说" 有时候基于一些特殊原因delegate也是需要retain。比如官方的NSURLConnection就是一个典型retain了delegate的例子"我在想如果真是这样,那是什么样的特殊原因呢?@sycx @btxkenshin @terryso @tinyfool 各位大神 你们怎么看?

6楼 ·
terryso 回复于 2013年08月19日

@morpheus198 我看不到NSURLConnection哪里用了retain的delegate?

7楼 ·
morpheus1984 回复于 2013年08月19日

@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."

8楼 ·
terryso 回复于 2013年08月19日

@morpheus198 嗯,我试验了一下,NSURLConnection的确是会retain它的delegate。不过我想那是因为,NSURLConnection没有一个delegate属性,你必须通过初始化方法把delegate对象传进去,这样NSURLConnection自己就必须retain delegate留来自己用,并且NSURLConnection在请求结束之后,它会自己release它的delegate,这样调用方就不用自己release。 而BMKMapView是有一个delegate属性的,加了retain就会有可能导致retain cycle问题,搞得调用方很麻烦。

9楼 ·
terryso 回复于 2013年08月19日

这是我的理解,不知道是否正确,请各位大神拍砖。。。

10楼 ·
Elden 回复于 2013年08月19日

GPS定位跟网络下载地图信息都是异步的,用assign可能会遇到调用者提前释放导致crash。

本帖有21个回复,因为您没有注册或者登录本站,所以只能看到本帖的10条回复。如果想看到全部回复,请注册或者登录本站。
登录 或者 注册
[顶 楼]
|
|
[底 楼]
|
|
[首 页]

AltStyle によって変換されたページ (->オリジナル) /