Memory leak in UITableView?
I'm sorry in advance as maybe this is a dumb and noob question...
I'm using SDWebImage to display pictures in a UITableView in my cellForRowAtIndexPath method, using the classic
[cell.pointPicture setImageWithURL:[NSURL URLWithString:thePoint.imageURL] placeholderImage:[UIImage imageNamed:POINT_DEFAULT_IMAGE]];
(the displayed pictures are light and well compressed jpgs, just some ko, and yes I'm using dequeueReusableCellWithIdentifier of course).
When I inspect my app with " Instrument - Allocations ", and just scroll down my UITableView (with 40 cells containing picture, a bit like Instagram), I got a huge amount of memory used ! (see screenshot)
But it seems to be " VM ", and especially " VM: CG raster data " from the coreGraphics library.
So the questions are :
I'm sorry but after few search on the web I can't find any relevant information concerning the " VM: CG raster data "... Any idea? Thanks in advance !
I experienced the same issue and found the root cause, at least in my implementation.
Root Cause
The root cause was that my table cell stored a strong pointer to the image which is stored in SDWebImage cache. This strong pointer, caused the memory release function of SDWebImage removeAllObjects
not to release any memory when receiving a memory warning from iOS.
Solution 1 - Keep weak
pointers from within your ViewController and allow only SDWebImage to keep a strong pointer to all UIImage
objects.
Solution 2 - Implement - (void)prepareForReuse
and set the image pointers to nil
To test this solution run your application and simulate a memory warning - You will be able to see the data removed
I had the same issue. My problem seemed to originate from something else than the SDWebImage
cache but since it did contribute to the memory buildup, the first thing I though was that the cache could be the cause of my problem. But it wasn't. It could be you have the same kind of issue. Keep in mind that I am using ARC.
Leaks
template and check for the allocation of your own classes in the Allocation Summary
. Leaks
instrument because you are using ARC. So Instruments could think everything is going oké but there still could be a leak somewhere. By diving in to the allocation of your own classes you could figure out what is going wrong. Leaks
template and not while using the Allocations
template. My problem was that I was referencing instance variables and self directly from within blocks without reassigning them to __weak
variables. When self is used within a block it will automatically be retained by ARC and sometimes never released. A weak reference prevents that from happening.
For example, this is wrong:
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardDidShowNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
[self.view setContentOffset:CGPointMake(0.0, kKeyboardOffset) animated:YES];
}];
You should call self using a __weak
reference like this:
__weak YourViewControllerClass *weakSelf = self;
[[NSNotificationCenter defaultCenter] addObserverForName:UIKeyboardDidShowNotification object:nil queue:nil usingBlock:^(NSNotification *note) {
[weakSelf.view setContentOffset:CGPointMake(0.0, kKeyboardOffset) animated:YES];
}];
Since my app uses a lot of block's I had a ton of leaks the Leaks
instrument could not detect. When I fixed them the memory problem was gone.
I hope this helps.
As explained to me by someone working on SDWebImage :
SDWebImage
cache images is using NSCache
. It is discardable memory. See Apple documentation, so this is a perfectly normal behavior and the memory is released if needed.
上一篇: 天真的方式在1和0的矩形中查找最大块
下一篇: 内存泄漏在UITableView?