Puzzling memory creep
Puzzling memory creep
- Subject: Puzzling memory creep
- From: Richard Kennaway <email@hidden>
- Date: Fri, 14 Aug 2015 21:29:59 +0100
I've written an iOS app that, according to Instruments, seems to very slowly allocate more and more memory over time, although I can see no reason for it. After starting it, and letting it settle down, I see in the Allocations tool several entries in the "#Persistent" column creeping upwards. Typically, I see an item "CFArray (mutable-variable)" incrementing its #Persistent once a second, and an item "Malloc 32 Bytes" incrementing by 2 every second. The Leaks tool shows nothing. Taking Generation snapshots at intervals of a second or two shows the steady accumulation of small allocations, described as <non-object>.
I'm using XCode 6.4 and running this in the simulator for iPhone 6 and iOS 8.4. I've also tried the iPad2 and iOS 8.4 with similar results, although there the item that ticks up and up is "Malloc 64 bytes", at a rate of about 1 KB every 5 seconds. The project is compiled with ARC turned on. The high water mark of total memory use displayed in XCode increases by a megabyte in something over an hour and an overnight run shows no sign of it stopping.
But I cannot see what is causing this. It's a very small app, and if I let it run without interacting with it, the only code it executes is the following method of the single view controller, invoked by an NSTimer once a second to update a display of the time.
- (void)updateTime {
NSDate *now = [NSDate date];
double seconds = [now timeIntervalSinceReferenceDate];
double intseconds = round(seconds);
now = [NSDate dateWithTimeIntervalSinceReferenceDate:intseconds];
[dateFormatter setDateFormat:
[NSDateFormatter dateFormatFromTemplate:@"jjmmss" options: 0 locale: thelocale]];
[[self timestring] setText: [dateFormatter stringFromDate: now]];
[dateFormatter setDateFormat:
[NSDateFormatter dateFormatFromTemplate:@"EEEdMMM" options: 0 locale: thelocale]];
[[self daystring] setText: [dateFormatter stringFromDate: now]];
[dateFormatter setDateFormat:
[NSDateFormatter dateFormatFromTemplate:@"yyyy" options: 0 locale: thelocale]];
[[self yearstring] setText: [dateFormatter stringFromDate: now]];
}
timestring, daystring, and yearstring are properties of my ViewController class connected to labels in the storyboard:
@property (weak, nonatomic) IBOutlet UILabel *timestring;
@property (weak, nonatomic) IBOutlet UILabel *daystring;
@property (weak, nonatomic) IBOutlet UILabel *yearstring;
dateFormatter and thelocale are private instance variables, initialised once in viewDidLoad(). I've also tried versions where these are variables local to updateTime(), and where "now" is an instance variable, but moving these around gives the same results. I've also tried, with equal lack of effect, splitting up some of the one-liners into things like:
NSString *thestring = [dateFormatter stringFromDate: now];
[[self timestring] setText: thestring];
When the app is in the background it does nothing (it invalidates the NSTimer and sets the instance variable holding it to NULL), and Allocations reports no activity.
What is causing this problem? Instruments says the Responsible Library is libdispatch.dylib, and the Responsible Caller is _dispatch_continuation_alloc_from_heap. The names suggest that this may be nothing to do with the code above. Google turns up a small number of queries regarding memory leaks with similar symptoms, but no answers.
--
Richard Kennaway
_______________________________________________
Cocoa-dev mailing list (email@hidden)
Please do not post admin requests or moderator comments to the list.
Contact the moderators at cocoa-dev-admins(at)lists.apple.com
Help/Unsubscribe/Update your Subscription:
This email sent to email@hidden