请教关于 __weak 的问题

2015-07-10 10:23:20 +08:00
 georgetso
方法声明
- (void)foo:(NSObject __weak *)obj {}

方法调用
[self foo:bar];

bar 是一个 strong referenced object
传入后的obj设置 __weak 关键字后,是否会变成 weak?
2804 次点击
所在节点    iDev
12 条回复
w99wen
2015-07-10 10:46:50 +08:00
会的把。

我想到的类似的情况:

在代码块中使用self的时候,有是有也要用 __weak的新的局部变量weakself来替换self,这样就不会出现内存死锁的问题。你这个不是一样吗。self就是你的这个bar,bar不会被释放的。不过再你的方法内部,这个bar,也就是方法内部的obj是__weak的,里面的strong的数据能被正常释放而不会死锁。

那个和你这个很像。
newtonisaac
2015-07-10 10:53:57 +08:00
不要这样用。
georgetso
2015-07-10 10:55:29 +08:00
vincentxue
2015-07-10 11:37:21 +08:00
ARC 环境下在此处放一个关键字是告诉编译器如何正确处理这个引用。所以你方法调用后,bar 依然是 strong 的,但 obj 是 weak 的。因为 OC 传进来的是引用。
noli
2015-07-10 11:59:02 +08:00
设置函数参数是 __weak 引用是没有作用、没有实际意义的:

1. 假如传入参数并且运行以后,没有任何其他变量持有(retain) 这个对象,那么传进去是 __weak 是 __strong 都对生命周期没有任何影响。

2. 假如传入参数并且运行以后,有一个或者多个其他变量 retain 了这个对象,那么决定参数的引用计数增加的,是持有者本身是 __weak 还是 __strong,跟传进去的时候是怎样没有关系
loveuqian
2015-07-10 12:17:38 +08:00
同问
参数还能带weak的?
声明后面为啥有大括号啊
anerevol
2015-07-10 12:21:56 +08:00
楼上说得不错。
再补充下,weak,strong是修饰指向对象指针的,而不是对象本身。
kobe1941
2015-07-10 12:53:43 +08:00
@noli 认同函数的形参是__weak 引用无意义,且其对 引用计数无影响,不过我更愿意这样子解释:

Objective-C里对象都是用指针指向,决定对象的引用计数增加的,是另一个__strong指针指向了该对象所在的内存,那么根据的楼主的原题,形参用__weak修饰,一个__weak指针把该对象的地址传递进了函数里,相当于多了一个__weak指针指向原对象的内存地址,对象引用计数不变,之后该形参被销毁,确实是无意义。

不过我倒是认为,默认用__strong修饰的形参,会在传递参数给函数的时候使对象的引用计数+1,之后函数调用完毕,形参因超出函数作用域而销毁,从而使原对象引用计数-1。最终形参不影响该对象的引用计数。

只是悲剧的是,我没办法验证,给对象发送retanCount返回的值是不准确的。
newtonisaac
2015-07-10 13:09:41 +08:00
@georgetso 变量声明的时候用
georgetso
2015-07-10 15:08:03 +08:00
@loveuqian 不要在意这些细节
110293734
2015-07-10 16:06:13 +08:00
stack的时候,声明一个临时变量默认是__strong 修饰符,如果是__weak,直接变nil。
你可以xcode 试下。看看出啥警告

one word:不建议这么用 ,NSError *__autorelease*error 除外,因为指针的指针,已经跳出 ARC管理范围了。
rannie
2015-07-16 09:52:00 +08:00
__weak 修饰参数没有什么意义吧

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

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

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

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

© 2021 V2EX