Crash on iOS when taking multiple pictures
------------------------------------------
Key: CB-401
URL: https://issues.apache.org/jira/browse/CB-401
Project: Apache Callback
Issue Type: Bug
Components: iOS
Affects Versions: 1.4.0
Environment: 1.4.1, 1.5.0 on iOS
Crash on iPad (third generation)
Reporter: Marc Rhodes
Assignee: Shazron Abdullah
Priority: Critical
We have an app that allows the user to take four pictures. It had been working
fine but we started seeing crashes when we tested on a new iPad (third
generation).
We have eliminated the crash in our application by making the following change
to the PhongeGap/Cordova code. I tested with PhoneGap 1.4.1. I'm currently
upgrading to Cordova 1.5.0 but a review of {{Camera.m}}/{{CDVCamera.m}} shows
only the name changes.
Line numbers below correspond to {{CDVCamera.m}}.
In {{CDVCamera.m}}, we found the following code around line 67:
{code}
if (self.pickerController == nil)
{
self.pickerController = [[[CameraPicker alloc] init] autorelease];
}
{code}
We removed the autorelease message:
{code}
if (self.pickerController == nil)
{
self.pickerController = [[CameraPicker alloc] init];
}
{code}
Our reason for doing this is that we found that {{self.pickerController}}
appears to be released in all the right places:
* at line 220 in {{imagePickerController:didFinishPickingMediaWithInfo:}}
{code}
self.pickerController = nil;
{code}
* at line 251 in {{imagePickerControllerDidCancel:}}
{code}
self.pickerController = nil;
{code}
* at line 399 in {{dealloc}}:
{code}
self.pickerController = nil;
{code}
This last one may not always be necessary but should be okay since the previous
releases set the instance variable to {{nil}}. And, of course, since
pickerController is a property, setting it to {{nil}} serves to release it.
I think both autoreleasing and explicitly releasing an object is not following
the memory management rules. Apple says:
*
[https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html]
* Memory Management Policy
** Basic Memory Management Rules
*** You relinquish ownership of an object by sending it a
release message or an autorelease message.
My thought (confirmed with an instructor at [Big Nerd
Ranch|http://www.bignerdranch.com/]) is that "or" is the key word in this
statement and removing the extra autorelease could certainly prevent zombie
crashes that only occur in certain circumstances.
This issue seems like a duplicate of
[CB-264|https://issues.apache.org/jira/browse/CB-264] but since that one is
resolved as "won't fix," I have submitted this new issue containing a possible
solution.
--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators:
https://issues.apache.org/jira/secure/ContactAdministrators!default.jspa
For more information on JIRA, see: http://www.atlassian.com/software/jira