【有疑问,待解决】iOS 9 memory leak

来源:互联网 发布:翻译软件 英文怎么说 编辑:程序博客网 时间:2024/06/05 07:08

一、UITabBarButton initWithImage:selectedImage:label:withInsets

使用instrument测试leaks,测出结果:

点击切换 Call Tree 双击条目

跳转代码为:

 for (int i=0; i<self.tabBar.items.count; i++) {        UITabBarItem*item=self.tabBar.items[i];        NSString*imageName=seleImageArray[i];        NSString*unImageName=unSeleImageArray[i];        [item setSelectedImage:[[UIImage imageNamed:imageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ]];        [item setImage:[[UIImage imageNamed:unImageName] imageWithRenderingMode:UIImageRenderingModeAlwaysOriginal ]];                item.title=tabBarName[i];        item.tag=i;    }

标注颜色的位置 内存泄露 4bytes*2

二、UIWebSelectionAssistant addNonEditableForceTextSelectionGestureRecognizersToView 造成内存泄露

三、OpenUDID memory leak

代码

  NSString * appUID = (NSString *) [defaults objectForKey:kOpenUDIDAppUIDKey];    if(appUID == nil)    {      // generate a new uuid and store it in user defaults      CFUUIDRef uuid = CFUUIDCreate(NULL);      appUID = (NSString *) CFUUIDCreateString(NULL, uuid);      CFRelease(uuid);    }

instrument 检测leak 结果

  appUID = (NSString *) CFUUIDCreateString(NULL, uuid);

泄露
这个方法返回的对象是CFStringRef格式,这是个Core Foundation对象,在这里将其强制转换以后可以当做NSString对象来使用,但是这个CF对象是的引用计数+1,此时是需要处理的,在ARC下也不会自动释放,需要手动在使用完这个对象后调用CFRelease去手动释放即: CFRelease(uuid);

此时测试还存在内存泄露,

  [appUID autorelease];

对appUID 添加自动释放池问题解决,再次检测leak memory不存在。

0 0