1
w99wen 2015-07-10 10:46:50 +08:00
会的把。
我想到的类似的情况: 在代码块中使用self的时候,有是有也要用 __weak的新的局部变量weakself来替换self,这样就不会出现内存死锁的问题。你这个不是一样吗。self就是你的这个bar,bar不会被释放的。不过再你的方法内部,这个bar,也就是方法内部的obj是__weak的,里面的strong的数据能被正常释放而不会死锁。 那个和你这个很像。 |
2
newtonisaac 2015-07-10 10:53:57 +08:00
不要这样用。
|
3
georgetso OP @newtonisaac why
|
4
vincentxue 2015-07-10 11:37:21 +08:00
ARC 环境下在此处放一个关键字是告诉编译器如何正确处理这个引用。所以你方法调用后,bar 依然是 strong 的,但 obj 是 weak 的。因为 OC 传进来的是引用。
|
5
noli 2015-07-10 11:59:02 +08:00
设置函数参数是 __weak 引用是没有作用、没有实际意义的:
1. 假如传入参数并且运行以后,没有任何其他变量持有(retain) 这个对象,那么传进去是 __weak 是 __strong 都对生命周期没有任何影响。 2. 假如传入参数并且运行以后,有一个或者多个其他变量 retain 了这个对象,那么决定参数的引用计数增加的,是持有者本身是 __weak 还是 __strong,跟传进去的时候是怎样没有关系 |
6
loveuqian 2015-07-10 12:17:38 +08:00 via iPhone
同问
参数还能带weak的? 声明后面为啥有大括号啊 |
7
anerevol 2015-07-10 12:21:56 +08:00
楼上说得不错。
再补充下,weak,strong是修饰指向对象指针的,而不是对象本身。 |
8
kobe1941 2015-07-10 12:53:43 +08:00
@noli 认同函数的形参是__weak 引用无意义,且其对 引用计数无影响,不过我更愿意这样子解释:
Objective-C里对象都是用指针指向,决定对象的引用计数增加的,是另一个__strong指针指向了该对象所在的内存,那么根据的楼主的原题,形参用__weak修饰,一个__weak指针把该对象的地址传递进了函数里,相当于多了一个__weak指针指向原对象的内存地址,对象引用计数不变,之后该形参被销毁,确实是无意义。 不过我倒是认为,默认用__strong修饰的形参,会在传递参数给函数的时候使对象的引用计数+1,之后函数调用完毕,形参因超出函数作用域而销毁,从而使原对象引用计数-1。最终形参不影响该对象的引用计数。 只是悲剧的是,我没办法验证,给对象发送retanCount返回的值是不准确的。 |
9
newtonisaac 2015-07-10 13:09:41 +08:00
@georgetso 变量声明的时候用
|
11
110293734 2015-07-10 16:06:13 +08:00
stack的时候,声明一个临时变量默认是__strong 修饰符,如果是__weak,直接变nil。
你可以xcode 试下。看看出啥警告 one word:不建议这么用 ,NSError *__autorelease*error 除外,因为指针的指针,已经跳出 ARC管理范围了。 |
12
rannie 2015-07-16 09:52:00 +08:00
__weak 修饰参数没有什么意义吧
|