2011-10-08 212 views
2

我试图在这里建立RSS阅读器,问题是,当用户完成阅读ARTICAL并按回的dealloc不叫我的retainCount正在增加?

我得到了retainCount 6 &一些时间7!

我有很多定制的面板

时后退按钮按下的POP操作的观点,并没有所谓的dealloc的?!

.h文件中:

@interface ArticalViewController : UIViewController<UIWebViewDelegate,UIScrollViewDelegate,UIActionSheetDelegate,ArticalBottomPanelDelegate,ArticalContentFetcherDelegate> { 

    UIWebView * description_; 
    UIActivityIndicatorView * ind_; 
    ArticalModel * artical_; 
    NSString * content; 
    UIButton * faceBookShareBtn_; 

    UIBarButtonItem * btnSharePanel_; 


    CustomTopToolBar * topToolbar_; 

    ArticalBottomPanel* articalBottomPanel_; 
    MovingSharePanel * movingSharePanel_; 

    int fontSize; 
    BOOL favoStatus; 
    ArticalContentFetcher *datafetcher_;  

} 


@property (nonatomic,retain) IBOutlet UIWebView * description; 
@property (nonatomic,retain) IBOutlet UIActivityIndicatorView * ind; 
@property (nonatomic,retain) ArticalModel * artical; 
@property (nonatomic,retain) IBOutlet UIButton * faceBookShareBtn; 


@property (nonatomic,retain) IBOutlet CustomTopToolBar * topToolbar; 
@property (nonatomic , retain) IBOutlet ArticalBottomPanel * articalBottomPanel; 
@property (nonatomic , retain) IBOutlet MovingSharePanel * movingSharePanel; 

@property (nonatomic , retain) ArticalContentFetcher *datafetcher; 




-(void) loadArtical:(ArticalModel *)artical; 
- (void) loadArticalContentFromInternet; 
-(void) changeFavoriteBtnIcon:(BOOL) status; 
-(void)backBtnPressed:(id) sender; 

-(IBAction)openPostBtnPressed:(id)sender; 

@end 

.m文件:

#import "ArticalViewController.h" 


    @implementation ArticalViewController 


    @synthesize description=description_; 
    @synthesize artical=artical_; 
    @synthesize ind=ind_; 

    @synthesize faceBookShareBtn=faceBookShareBtn_; 

    @synthesize topToolbar=topToolbar_; 
    @synthesize articalBottomPanel=articalBottomPanel_; 
    @synthesize movingSharePanel=movingSharePanel_; 
    @synthesize datafetcher=datafetcher_; 

    - (void)dealloc 
    { 
     NSLog(@"ArticalViewController : dealloc"); 
     [description_ release]; 
     [ind_ release]; 
     [artical_ release]; 
     [content release]; 
     [faceBookShareBtn_ release]; 

     [btnSharePanel_ release]; 


     [topToolbar_ release]; 

     [articalBottomPanel_ release]; 
     [movingSharePanel_ release]; 
     [datafetcher_ release]; 

     [super dealloc]; 
    } 

    #pragma mark - 
    #pragma mark - View lifecycle 

    - (void)viewDidLoad 
    { 
     [super viewDidLoad]; 
     fontSize=100; 


     [self.articalBottomPanel setDelegate:self]; 
     [self.movingSharePanel setArtical:self.artical]; 
     [self.movingSharePanel setParentView:self]; 


     [self.topToolbar.rightButon setFrame:CGRectMake(260 , 3, 50, 30)]; 
     [self.topToolbar.rightButon addTarget:self action:@selector(backBtnPressed:) forControlEvents:UIControlEventTouchUpInside]; 
     [self.topToolbar.rightButon setImage:[UIImage imageNamed:@"back-button"] forState:UIControlStateNormal]; 

     [self.topToolbar.leftButon setFrame:CGRectMake(10 , 3, 50, 30)]; 
     [self.topToolbar.leftButon setImage:[UIImage imageNamed:@"button-toolbar-post-link"] forState:UIControlStateNormal]; 
     [self.topToolbar.leftButon addTarget:self action:@selector(openPostBtnPressed:) forControlEvents:UIControlEventTouchUpInside]; 


     self.topToolbar.label.text =self.artical.category; 
     // [label release]; 

     //Navigation Buttons 
     self.navigationItem.hidesBackButton=YES; 

     //Check if artical is favorited or not 
     [self changeFavoriteBtnIcon:[Favorites chechArtical:self.artical]]; 



     [self.description setBackgroundColor:[UIColor clearColor]]; 
     [self.description setBackgroundColor:[UIColor colorWithPatternImage:[UIImage imageNamed:@"1px-post-views-background"]]]; 

     if([[self.artical content] length] >1){ 
      NSLog(@"[[self.artical content] length] >1"); 
      [self loadArtical:self.artical]; 
     }else { 
      NSLog(@"else"); 
      self.datafetcher=[[ArticalContentFetcher alloc ]init ]; 
      [self.datafetcher setArticalContentFetcherDelegate:self]; 
      [NSThread detachNewThreadSelector:@selector(loadArticalContentFromInternet) toTarget:self withObject:nil]; 

     } 




    } 
    #pragma mark - 
    #pragma mark ArticalConnectionFeed Delegate Methods 
    -(void) articalContentConnectionDoneWithArtical:(ArticalModel *)artical { 
     NSLog(@"articalContentConnectionDoneWithArtical"); 
     [self loadArtical:artical]; 
    } 
    -(void) articalContentConnectionFailed{ 
     NSLog(@"articalContentConnectionFailed"); 

    } 
    #pragma mark - 
    #pragma mark ArticalBottomPanelDelegate Delegate Methods 

    -(void) openPanelFired{ 
     NSLog(@"openPanelFired"); 
     [self.movingSharePanel movePanel]; 
     // [self.articalBottomPanel.btnOpenSharePanel setHidden:YES]; 
    } 

    -(void) fontBtnFired:(int)font{ 
     // NSLog(@"fontBtnFired : %d",font); 
     if(font==1){ 
      [self.description stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '90%'"]; 
     }else { 
      [self.description stringByEvaluatingJavaScriptFromString:@"document.getElementsByTagName('body')[0].style.webkitTextSizeAdjust= '-10%'"]; 
     } 
    } 
    -(void) favoBtnFired { 
     NSLog(@"favoBtnFired"); 
     favoStatus=[Favorites processArtical:self.artical]; 
     [self changeFavoriteBtnIcon:favoStatus]; 
    } 

    -(void) changeFavoriteBtnIcon:(BOOL) status{ 
     if (status){ 
      [self.articalBottomPanel.btnFavo setImage: [UIImage imageNamed:@"active-star.png"] forState:UIControlStateNormal]; 

     }else { 
      [self.articalBottomPanel.btnFavo setImage: [UIImage imageNamed:@"star.png"] forState:UIControlStateNormal]; 
     } 
    } 
    #pragma mark - 
    #pragma mark UIWebView Delegate Methods 
    -(BOOL) webView:(UIWebView *)inWeb shouldStartLoadWithRequest:(NSURLRequest *)inRequest navigationType:(UIWebViewNavigationType)inType { 
     if([InternetConnection getInternetStatus]){ 
      if (inType == UIWebViewNavigationTypeLinkClicked) { 
       [[UIApplication sharedApplication] openURL:[inRequest URL]]; 
       return NO; 
      } 
      return YES; 
     }else { 
      [InternetConnection ShowNoInternetAlert]; 
      return NO; 
     } 


    } 

    - (void)webViewDidFinishLoad:(UIWebView *)webView { 
     [self.ind stopAnimating]; 
    } 


    #pragma mark - 
    #pragma mark Class Methods 
    -(void) loadArtical:(ArticalModel *)artical{ 
     NSLog(@"loadArtical"); 
     [self.artical setContent:[artical content]]; 
     [self.artical setCategory:[artical category]]; 


     NSString * style=[[NSString alloc ] initWithFormat:@"<style> #offline img{display:none;} .wrap{text-align:right;line-height:22px; direction:rtl;} .title{font-size:20px;margin-bottom:5px;} .date{font-size:13px;} .cat{font-size:13px;} </style>"]; 

     if([InternetConnection getInternetStatus]) 
      NSLog(@"[InternetConnection getInternetStatus] : true"); 
     content=[[NSString alloc] initWithFormat:@"%@<div class='wrap' ><div class='title'>%@</div><div class='date'>%@</div><div class='cat'>%@</div>%@</div>",style,[self.artical title],[DateProcessor getInternetDateAndTimeForArticals:self.artical.pubDate],[self.artical category],[self.artical content] ]; 
     [ self.description loadHTMLString:content baseURL:[NSURL URLWithString:@""]]; 

     [style release]; 
    } 

    - (void) loadArticalContentFromInternet{ 
     NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
     [self.datafetcher loadArticlContentWithID:self.artical.ID]; 
     [[NSRunLoop currentRunLoop] run ]; 
     [pool release]; 


    } 
    -(void)backBtnPressed:(id) sender{ 
      NSLog(@"backBtnPressed"); 

     [self.navigationController popViewControllerAnimated:YES]; 


    } 

    #pragma mark - 
    #pragma mark IBActions  


    -(IBAction)openPostBtnPressed:(id)sender{ 
     if([InternetConnection getInternetStatus]){ 
      [InternetConnection openExternalUrl:self.artical.link]; 
     }else{ 
      [InternetConnection ShowNoInternetAlert]; 
     } 


    } 

    @end 

增加:

当我调用ARTICAL我用

avc=[[ArticalViewController alloc]initWithNibName:@"ArticalViewController" bundle:nil]; 
    avc.artical=[self.feeds objectAtIndex:indexPath.row]; 
    [self.navCon pushViewController:avc animated:YES]; 

    [avc release]; 
+0

看看这里http://stackoverflow.com/questions/577635/iphone-when-is-dealloc-for-a-viewcontroller-called – Mat

+0

我看了之前发送这个Q,但我问的是我的情况,什么是我的代码错了!? – Yahia

回答

41

我发现追踪保留计数和丢失保留 - 释放对的最佳方法是使用工具。 Hit Profile(Cmd⌘ + I)并选择泄漏模板。即使泄漏不会自动发现,保留更改也会被记录下来,以便您可以手动追踪其他保留。要做到这一点,请在找到您的班级名称对象摘要当选择分配文书。如果你找不到它,这意味着所有的实例都被释放。否则点击时,您选择的类名出现的箭头: Select the class name and click on the arrow to view living instances 你会看到你的类的所有生活实例: Select the instance and click on the arrow to view its retains/releases

如果假定有应该已经释放某些情况下,选择一个,然后点击在对象地址旁边出现的箭头上。现在你应该看到任何保留或释放被调用该对象与已在执行此操作方法的名称上: Double click to see what line of code invoked this retain/release

RefCt栏显示retainCount被调用的动作后,当你在任何双击保留/释放仪器会向您显示执行此操作的代码行: Responsible lines are highlighted

正如您所看到的,对象被添加到数组中并且永远不会从中删除。

根据我的经验,这是找到内存泄漏的最快和最简单的方法,即仪器不会自动检测到泄漏。我认为另一个良好的做法是看#活动对象摘要确保生存实例的数量完全符合您的预期。

0

NSThread detachNewThreadSelector:toTarget:withObject:保留其圆盾吨,在这种情况下是self。此外,自我是这里几件事的代表,通常你不想保留代表,所以如果你写了这些协议,检查你没有这样做。

+0

你的权利,我检查了我的代表,现在我有retainCount 2,但我调用[self.navigationController popViewControllerAnimated:YES]后; ,保留数是4! – Yahia

+0

我加了[self retain]; before [self.navigationController popViewControllerAnimated:YES];和dealloc正确调用,但它是真的调用[self release]; !?这是解决方案吗?! – Yahia

+0

弹出时的保留计数可能会有所不同,具体取决于您的loadArticalContentFromInternet方法是否在另一个线程上完成。你应该在弹出之前取消这个线程。无情地调用释放是危险的。找出你被保留的地方,并适当地释放。 – mbehan

9

您没有理由关心保留计数是多少。只要确保你平衡你的保留和发布。

5

看起来很奇怪,retainCount根本没有用于计算您的保留。由于其他原因保留的东西不是你拨打[myObject retain][[MyClass alloc] init]等。

最好忽略retainCount并学习memory management rulesretainCount会让你更加困惑。如果您仅开发iOS 5,最好忘记内存管理并使用ARC