[ 
https://issues.apache.org/jira/browse/CB-2395?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Christoph Jerolimov updated CB-2395:
------------------------------------

    Description: 
I found a obj-c reference counting problem with Cordova 2.4.

Analysing the retain/release calls of CDVViewController i found the following 
problem. If you just want fix this i added a recommendation at the! ;-)

 
*Retain:* When the view was displayed they load the request in a c-block 
(simplified source here!). This callback-code needs the CDVViewController 
itself:

{code}
- (void)viewDidLoad {
    ...
    [CDVUserAgentUtil acquireLock:^(NSInteger lockToken) {
        _userAgentLockToken = lockToken;
        [CDVUserAgentUtil setUserAgent:self.userAgent lockToken:lockToken];
        NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL ....;
        [self.webView loadRequest:appReq];
    }];
}
{code}


*Release:* To release the block (and so the CDVViewController) it's required to 
call the the {{acquireLock}} associated {{releaseLock}} method. This was called 
in the delegate methods of the webview.

{code}
- (void)webViewDidFinishLoad:(UIWebView*)theWebView   AND
- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error

    ...
    if (_userAgentLockToken != 0) {
        [CDVUserAgentUtil releaseLock:_userAgentLockToken];
        _userAgentLockToken = 0;
    }
{code}


*But:* If the webview.delegate was set to nil before the response was received 
the {{releaseLock}} was never called!


*To fix this* please add these lines at least to the {{dealloc}} method!

For iOS 5.x it makes also sense to add this to the {{viewDidUnload}} method 
where the webView.delegate was also removed. Otherwise remove this deprecated 
method completly. Feel also free to externalize the then 3 or 4 calls to 
CDVUserAgentUtil to a small privat method.

{code}
    if (_userAgentLockToken != 0) {
        [CDVUserAgentUtil releaseLock:_userAgentLockToken];
        _userAgentLockToken = 0;
    }
{code}


Thank you and best regards,

Christoph

  was:
I found a obj-c reference counting problem with Cordova 2.4.

Analysing the retain/release calls of CDVViewController i found the following 
problem. If you just want fix this i added a recommendation at the! ;-)

 
*Retain:* When the view was displayed they load the request in a c-block 
(simplified source here!). This callback-code needs the CDVViewController 
itself:

{code}
- (void)viewDidLoad {
    ...
    [CDVUserAgentUtil acquireLock:^(NSInteger lockToken) {
        _userAgentLockToken = lockToken;
        [CDVUserAgentUtil setUserAgent:self.userAgent lockToken:lockToken];
        NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL ....;
        [self.webView loadRequest:appReq];
    }];
}
{code}


*Release:* To release the block (and so the CDVViewController) it's required to 
call the the {{acquireLock}} associated {{releaseLock}} method. This was called 
in the delegate methods of the webview.

{code}
- (void)webViewDidFinishLoad:(UIWebView*)theWebView   AND
- (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error

    ...
    if (_userAgentLockToken != 0) {
        [CDVUserAgentUtil releaseLock:_userAgentLockToken];
        _userAgentLockToken = 0;
    }
{code}


*But:* If the webview.delegate was set to nil before the response was received 
the {{releaseLock}} was never called!


*To fix this* please add these lines at least two the {{dealloc}} method!

For iOS 5.x it makes also sense to add this to the {{viewDidUnload}} method 
where the webView.delegate was also removed. Otherwise remove this deprecated 
method completly. Feel also free to externalize the then 3 or 4 calls to 
CDVUserAgentUtil to a small privat method.

{code}
    if (_userAgentLockToken != 0) {
        [CDVUserAgentUtil releaseLock:_userAgentLockToken];
        _userAgentLockToken = 0;
    }
{code}


Thank you and best regards,

Christoph

    
> iOS: Timing issue in user-agent lock mechanism (memory leaking)
> ---------------------------------------------------------------
>
>                 Key: CB-2395
>                 URL: https://issues.apache.org/jira/browse/CB-2395
>             Project: Apache Cordova
>          Issue Type: Bug
>          Components: iOS
>    Affects Versions: 2.4.0
>            Reporter: Christoph Jerolimov
>            Assignee: Andrew Grieve
>             Fix For: 2.5.0
>
>
> I found a obj-c reference counting problem with Cordova 2.4.
> Analysing the retain/release calls of CDVViewController i found the following 
> problem. If you just want fix this i added a recommendation at the! ;-)
>  
> *Retain:* When the view was displayed they load the request in a c-block 
> (simplified source here!). This callback-code needs the CDVViewController 
> itself:
> {code}
> - (void)viewDidLoad {
>     ...
>     [CDVUserAgentUtil acquireLock:^(NSInteger lockToken) {
>         _userAgentLockToken = lockToken;
>         [CDVUserAgentUtil setUserAgent:self.userAgent lockToken:lockToken];
>         NSURLRequest* appReq = [NSURLRequest requestWithURL:appURL ....;
>         [self.webView loadRequest:appReq];
>     }];
> }
> {code}
> *Release:* To release the block (and so the CDVViewController) it's required 
> to call the the {{acquireLock}} associated {{releaseLock}} method. This was 
> called in the delegate methods of the webview.
> {code}
> - (void)webViewDidFinishLoad:(UIWebView*)theWebView   AND
> - (void)webView:(UIWebView*)webView didFailLoadWithError:(NSError*)error
>     ...
>     if (_userAgentLockToken != 0) {
>         [CDVUserAgentUtil releaseLock:_userAgentLockToken];
>         _userAgentLockToken = 0;
>     }
> {code}
> *But:* If the webview.delegate was set to nil before the response was 
> received the {{releaseLock}} was never called!
> *To fix this* please add these lines at least to the {{dealloc}} method!
> For iOS 5.x it makes also sense to add this to the {{viewDidUnload}} method 
> where the webView.delegate was also removed. Otherwise remove this deprecated 
> method completly. Feel also free to externalize the then 3 or 4 calls to 
> CDVUserAgentUtil to a small privat method.
> {code}
>     if (_userAgentLockToken != 0) {
>         [CDVUserAgentUtil releaseLock:_userAgentLockToken];
>         _userAgentLockToken = 0;
>     }
> {code}
> Thank you and best regards,
> Christoph

--
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