2011-09-15 12 views
0

は、これは私のコードのdealloc UILabel

- (UIView *)carousel:(iCarousel *)carousel viewForItemAtIndex:(NSUInteger)index 
{ 
    MWFeedItem *item = [reader.feedItems objectAtIndex:index]; 

    //INIZIALIZZO L'ARRAY CARICANDOLO DAL FILE!!!! 
    //[reader.feedItems initWithContentsOfFile:[[NSDictionary alloc] initWithContentsOfFile:@"Library/NewsPad"]]; 

    //create a numbered view 
    UIView *view = [[[UIImageView alloc] initWithImage:[UIImage imageNamed:@"page_iPhone_Vertical.png"]] autorelease]; 

    CGRect frame = CGRectMake(40, 118, 228, 100); 

    UILabel *labelTitle = [[UILabel alloc] initWithFrame:frame]; 
    labelTitle.backgroundColor = [UIColor clearColor]; 
    labelTitle.textAlignment = UITextAlignmentLeft; 
    labelTitle.font = [UIFont fontWithName:@"Helvetica-Bold" size:12]; 
    labelTitle.numberOfLines=3; 
    [view addSubview:labelTitle]; 

    labelTitle.text = item.title; 

    [view addSubview:labelTitle]; 

    /* DATA 
    RSSEntry *entry = [_allEntries objectAtIndex:index]; 

    NSDateFormatter * dateFormatter = [[[NSDateFormatter alloc] init] autorelease]; 
    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; 
    [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; 
    NSString *articleDateString = [dateFormatter stringFromDate:entry.articleDate]; 
    */ 

    NSUserDefaults *settings = [NSUserDefaults standardUserDefaults]; 
    NSInteger loadImage=[settings objectForKey:@"loadImage"]; 

    /******** Get the image **********/ 
    NSString *url = [self getFirstImage:item.summary]; 
    //NSString *url = item.image; 

    if (loadImage != 0 && url != nil) { 
     //Create a managed image view and add it to the cell (layout is very naieve) 

     image = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"loading.png"]]; 
     image.frame = CGRectMake(45, 200, 210, 150); 
     [view addSubview:image]; 
     image.imageURL = [NSURL URLWithString:url]; 

     /* OLD!!! 
     HJManagedImageV *image; 
     image = [[[HJManagedImageV alloc] initWithFrame:CGRectMake(45, 200, 210, 150)] autorelease]; 
     image.tag = 999; 

     [view addSubview:image]; 

     //set the URL that we want the managed image view to load 
     image.url = [NSURL URLWithString:url]; 

     //tell the object manager to manage the managed image view, 
     //this causes the cached image to display, or the image to be loaded, cached, and displayed 
     [objMan manage:image]; 
     */ 

     frame= CGRectMake(40, 205, 230, 400); 
     UILabel *desc = [[[UILabel alloc] initWithFrame:frame] autorelease]; 
     desc.numberOfLines=6; 
     desc.backgroundColor = [UIColor clearColor]; 
     //desc.textAlignment = UITextAlignmentCenter; 
     desc.font = [desc.font fontWithSize:12]; 
     [view addSubview:desc]; 
     //SETTO DESCRIPTION 

     //rimuovo tag html 
     NSString *descrizione=[item.summary stringByConvertingHTMLToPlainText]; 
     /* DEBUG 
     NSString *descrizione=item.summary; 

     */ 
     [desc setText:descrizione]; 

     //NSLog(item.summary);  
    } 
    else { 
     frame= CGRectMake(40, 90, 235, 400); 
     UILabel *desc = [[[UILabel alloc] initWithFrame:frame] autorelease]; 
     desc.numberOfLines=15; 
     desc.backgroundColor = [UIColor clearColor]; 
     //desc.textAlignment = UITextAlignmentCenter; 
     desc.font = [desc.font fontWithSize:12]; 
     [view addSubview:desc]; 
     //SETTO DESCRIPTION 
     //rimuovo tag html 
     NSString *descrizione=[item.summary stringByConvertingHTMLToPlainText]; 
     /* DEBUG 
     NSString *descrizione=item.summary; 
     */ 
     [desc setText:descrizione]; 
    } 

    return view; 
} 

なぜ私は自分のコードに[labelTitleリリース]または[降順リリース]アプリのcrashsを追加した場合は?

+0

なぜあなたは '呼び出している時に見ることができます[ビューaddSubview:labelTitle]'二回? –

+0

それはエラーです...申し訳ありません:D –

答えて

3

あなたはその質問に多くのコードを書いています。

labelTitleは表示されているコードからは正常に見えますが、descは自動再生されたオブジェクトです。

UILabel *desc = [[[UILabel alloc] initWithFrame:frame] autorelease]; 

それは+1のカウントを保持しているが、(変数がスコープの外に出る通常、直後に)それが時間内にいくつかの将来の時点でのカウントを保持デクリメントれる自動解放されました。だから、それを解放する理由はありません。

NSAutoReleasePool on apple's docsについて詳しく読むことができます。

あなたはまた、How does the NSAutoreleasePool autorelease pool work?

+0

答えのサムのおかげで!だから、私はシステムがオートリレースオブジェクトをリリースできることを理解すれば? –

+0

すべてのスレッドはNSAutoReleasePool *を持っています(または持っている必要があります)。オブジェクトに対して 'autorelease'メッセージを呼び出すと、この自動解放プールに追加されます。毎回、プールは排水されるか、オートリリースされたすべてのオブジェクトをクリーンアップします。メインスレッドには、UIEventsを処理するメッセージポンプがあり、このプールをUIEventsの間に排除します。これは私がそれを理解する方法です。 – Sam

+0

あまりにも多くのサムに感謝...私のコード内の他のすべてのオブジェクトが正しく割り当て解除されますか?関数によって返されたビューは、システムによって自動的に割り当て解除されましたか? –