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

时间:2022-02-15 08:59:08

一、UITabBarButton initWithImage:selectedImage:label:withInsets

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

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

点击切换 Call Tree 双击条目

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

跳转代码为:

 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不存在。