Приложение вылетает при выпуске пользовательской ячейки таблицы - PullRequest
1 голос
/ 29 августа 2011

У меня проблема со сбоем приложения, когда освобождается мой пользовательский TableViewCell.

Ячейка инициализируется следующим образом в cellForRowAtIndexPath:

SearchTableViewCell *cell = (SearchTableViewCell *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
if (cell == nil) {
    cell = [[[SearchTableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
}

cell.nameLabel.text = @"some text";
cell.addressLabel.text = @"some more text";

выглядит класс самой ячейкикак это

#import <UIKit/UIKit.h>

@class EGOImageView;

@interface SearchTableViewCell : UITableViewCell {
    UILabel *nameLabel;
    UILabel *addressLabel;
    EGOImageView *imageView;
}

@property (nonatomic, retain) UILabel *nameLabel;
@property (nonatomic, retain) UILabel *addressLabel;

- (UILabel *)labelWithColor:(UIColor*)color selectedColor:(UIColor*)selectedColor fontSize:(CGFloat)fontSize bold:(BOOL)bold frame:(CGRect)rect;
- (void)setThumb:(NSString*)thumb;

@end

.m

#import "SearchTableViewCell.h"
#import "EGOImageView.h"

#import "UIView+Additions.h"

@implementation SearchTableViewCell

@synthesize nameLabel = _nameLabel, addressLabel = _addressLabel;

- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier {
    if ((self = [super initWithStyle:style reuseIdentifier:reuseIdentifier])) {

        // Initialization code
        UIView *myContentView = self.contentView;

        // Name
        _nameLabel = [self labelWithColor:[UIColor blackColor] selectedColor:[UIColor whiteColor] fontSize:16.0f  bold:YES frame:CGRectMake(140.0f, 16.0f, 181.0f, 21.0f)];
        [myContentView addSubview:_nameLabel];
        [_nameLabel release];


        // Adress
        _addressLabel = [self labelWithColor:[UIColor blackColor] selectedColor:[UIColor whiteColor] fontSize:13.0f  bold:YES frame:CGRectMake(140.0f, _nameLabel.bottom, 181.0f, 21.0f)];
        [myContentView addSubview:_addressLabel];
        [_addressLabel release];


        // Image
        imageView = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"placeholder.png"]];
        imageView.frame = CGRectMake(9.0f, 9.0f, 120.0f, 80.0f);
        [myContentView addSubview:imageView];
        [imageView release];

    }
    return self;
}

- (UILabel *)labelWithColor:(UIColor*)color selectedColor:(UIColor*)selectedColor fontSize:(CGFloat)fontSize bold:(BOOL)bold frame:(CGRect)rect {

    UIFont *font;
    if(bold) {
        font = [UIFont boldSystemFontOfSize:fontSize];
    } else {
        font = [UIFont systemFontOfSize:fontSize];
    }

    UILabel *label = [[UILabel alloc] initWithFrame:rect];
    label.backgroundColor = [UIColor clearColor];
    label.textColor = color;
    label.highlightedTextColor = selectedColor;
    label.font = font;

    return label;
}


- (void)setThumb:(NSString*)thumb {
    imageView.imageURL = [NSURL URLWithString:thumb];
}

- (void)willMoveToSuperview:(UIView *)newSuperview {
    [super willMoveToSuperview:newSuperview];

    if(!newSuperview) {
        [imageView cancelImageLoad];
    }
}

- (void)dealloc {
    [_addressLabel release];
    [_nameLabel release];
    [imageView release];
    [super dealloc];
}

@end

Кто-нибудь есть идея, почему мое приложение падает при освобождении такой ячейки?закомментировав 2 метки и вид изображения на методе dealloc, приложение не падает, но тогда произойдет утечка памяти, верно?

спасибо за все подсказки!Пожалуйста, оставьте комментарий, если что-то неясно!

Ответы [ 3 ]

1 голос
/ 29 августа 2011
You already release the memory for that labels after adding to view,again you are trying to release  memory those objects are already relese  in dealloc method that's why it is killing.if you remove 3 statements in dealloc method  it will not crash.   
1 голос
/ 29 августа 2011

imageView выпускается дважды, один раз при создании:

imageView = [[EGOImageView alloc] initWithPlaceholderImage:[UIImage imageNamed:@"placeholder.png"]];
imageView.frame = CGRectMake(9.0f, 9.0f, 120.0f, 80.0f);
[myContentView addSubview:imageView];
[imageView release];

и один раз в dealloc:

- (void)dealloc {
    [_addressLabel release];
    [_nameLabel release];
    [imageView release];
    [super dealloc];
}
0 голосов
/ 29 августа 2011

Я думаю, что проблема в том, что вы освобождаете свои свойства непосредственно в функции initWithStyle и снова добавляете их в dealloc. Попробуйте удалить выпуск из initWithStyle:

Кроме того, вы назвали свои переменные без _ в интерфейсе, но с _ @ synthesize'ing в реализации

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...