ios – 为什么带有__weak限定符的变量会保留一个对象?

ios – 为什么带有__weak限定符的变量会保留一个对象?,第1张

概述这是我的代码: extern void _objc_autoreleasePoolPrint();int main(int argc, const char * argv[]){ NSArray __weak *tmp = nil; @autoreleasepool { NSArray __strong *obj = [[NSArray alloc] i 这是我的代码:

extern voID _objc_autoreleasePoolPrint();int main(int argc,const char * argv[]){    NSArray __weak *tmp = nil;    @autoreleasepool {        NSArray __strong *obj = [[NSArray alloc] init];        NSLog(@"obj &: %p",obj);        tmp = obj;        NSLog(@"tmp &: %p",tmp);        _objc_autoreleasePoolPrint();    }    NSLog(@"tmp: %@",tmp); // why not (null) ?    return 0;}

和控制台输出:

2013-05-01 22:14:32.966 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] obj &: 0x7fedf94031102013-05-01 22:14:32.969 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] tmp &: 0x7fedf9403110objc[40660]: ##############objc[40660]: autoRELEASE POolS for thread 0x7fff751af180objc[40660]: 2 releases pending.objc[40660]: [0x7fedf9805000]  ................  PAGE  (hot) (cold)objc[40660]: [0x7fedf9805038]  ################  POol 0x7fedf9805038objc[40660]: [0x7fedf9805040]    0x7fedf9403110  __NSArrayIobjc[40660]: ##############2013-05-01 22:14:32.971 SimpleConsoleObjectiveCApplicationWithARC[40660:f07] tmp: ()

PS#1

将NSArray更改为NSMutableArray并且tmp变量变为nil.

extern voID _objc_autoreleasePoolPrint();int main(int argc,const char * argv[]){    NSMutableArray __weak *tmp = nil;    @autoreleasepool {        NSMutableArray __strong *obj = [[NSMutableArray alloc] init];        NSLog(@"obj &: %p",tmp);    return 0;}

有人可以解释一下为什么它会这样运作吗?

解决方法 似乎[[NSArray alloc] init]返回空NSArray的“共享实例”:

NSArray *a = [[NSArray alloc] init];NSArray *b = [[NSArray alloc] init];NSLog(@"a &: %p",a);NSLog(@"b &: %p",b);

输出:

    a &: 0x100103110    b &: 0x100103110

即使你的强引用obj消失了,这个“共享实例”仍然存在,
因此弱指针不设置为nil.

显然,[[NSMutableArray alloc] init]无法返回共享实例.

总结

以上是内存溢出为你收集整理的ios – 为什么带有__weak限定符的变量会保留一个对象?全部内容,希望文章能够帮你解决ios – 为什么带有__weak限定符的变量会保留一个对象?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1054073.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存