[ 
https://issues.apache.org/jira/browse/CB-1578?page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel&focusedCommentId=13469748#comment-13469748
 ] 

Becky Gibson commented on CB-1578:
----------------------------------

Took your information and did the necessary clean up of notifications in the 
appropriate dealloc.   Patch is here: 
https://github.com/becka11y/incubator-cordova-ios/tree/cb1578

Will check in early next week. Shaz did the original work on this and if he is 
back from leave next week I'd like to give him a chance to review.
                
> App crash (while stopping) caused by an unregistered notification handler in 
> CDVConnection
> ------------------------------------------------------------------------------------------
>
>                 Key: CB-1578
>                 URL: https://issues.apache.org/jira/browse/CB-1578
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: iOS
>    Affects Versions: 2.0.0, 2.1.0
>         Environment: iOS, all versions
> XCode, all versions
>            Reporter: Christoph Jerolimov
>            Assignee: Shazron Abdullah
>            Priority: Critical
>
> The class {{CDVConnection}} registered itself as observer for background 
> events {{UIApplicationDidEnterBackgroundNotification}} and 
> {{UIApplicationWillEnterForegroundNotification}}. But it did NOT unregistered 
> these calls, for example in the dealloc method.
> This caused in different type of errors which all ends in an app crash. If a 
> CDVConnection instance was already removed from the memory the selectors 
> onPause and onResume will be called on random other objects which doesn't 
> support this selector (1) or illegal memory access!
> {code}
> # Only an example, this error calls selectors on "random memory / objects"!
> <Error>: -[CALayer onPause]: unrecognized selector sent to instance 0x1e56ac50
> {code}
> The code which register the notification could be found at the end of the 
> file in the selector {{[CDVConnection initWithWebView:]}}.
> The versions 2.0.0 and 2.1.0 does NOT cleanup "only" the two mentioned 
> events. Like you see in line 139:
> https://github.com/apache/incubator-cordova-ios/blob/2.0.0/CordovaLib/Classes/CDVConnection.m#L139
> https://github.com/apache/incubator-cordova-ios/blob/2.1.0/CordovaLib/Classes/CDVConnection.m#L139
> The current HEAD do additionally NOT remove the the event 
> {{kReachabilityChangedNotification}} from line 113 which should result in 
> another new bug in the upcoming version.
> https://github.com/apache/incubator-cordova-ios/blob/master/CordovaLib/Classes/CDVConnection.m#L113
> To fix this it's enough to add these removeObservers calls again to the 
> dealloc method.
> {code}
> [[NSNotificationCenter defaultCenter] removeObserver:self 
> name:kReachabilityChangedNotification object:nil];
> [[NSNotificationCenter defaultCenter] removeObserver:self 
> name:UIApplicationDidEnterBackgroundNotification object:nil];
> [[NSNotificationCenter defaultCenter] removeObserver:self 
> name:UIApplicationWillEnterForegroundNotification object:nil];
> {code}
> In generally it's would also be possible to remove the instance in CDVPlugin 
> for all events!? This would allow you to remove many code from many different 
> plugins and ensure that no other plugin forget these cleanup.
> {code}
>       [[NSNotificationCenter defaultCenter] removeObserver:self];
> {code}

--
This message is automatically generated by JIRA.
If you think it was sent incorrectly, please contact your JIRA administrators
For more information on JIRA, see: http://www.atlassian.com/software/jira

Reply via email to