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限定符的变量会保留一个对象?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)