2013-08-19 2 views
1

Как узнать, был ли объект выпущен?Как определить, был ли объект выпущен

Если UITableViewCell выведен на экран, объект kkcell будет автореализован UITableView.

Когда аудиопроигрыватель заканчивается, программа вызывает «[kkcell stopSpeakAmination]», но это приводит к сбою программы.

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ 

    [kkcell stopSpeakAmination]; 
    playing=NO; 
} 

Я также использую

if(kkcell) 

или

if(kkcell!=nil) 

, но он по-прежнему падает.

Вот еще какой-то код, который я использую:

//KKMessageCell2.m 
.... 
@property(nonatomic, retain) UIImageView *SenderVoiceNodePlaying; 
@property(nonatomic, retain) UIImageView *ReceiverVoiceNodePlaying; 
.... 

-(void)stopSpeakAmination{ 
    [self.SenderVoiceNodePlaying stopAnimating]; 
    [self.ReceiverVoiceNodePlaying stopAnimating]; 
} 

-(void)speakAminationOnRight:(UIButton*)btn{ 

    //rightside 
    NSArray *speekImageAry = [[NSArray alloc]initWithObjects: 
    [UIImage imageNamed:@"SenderVoiceNodePlaying001"], 
    [UIImage imageNamed:@"SenderVoiceNodePlaying002"], 
          [UIImage imageNamed:@"SenderVoiceNodePlaying003"], nil]; 


    self.SenderVoiceNodePlaying.animationImages = speekImageAry; 
    self.SenderVoiceNodePlaying.animationDuration = 1.0; 
    self.SenderVoiceNodePlaying.animationRepeatCount = 0; 
    [self.SenderVoiceNodePlaying startAnimating]; 

    NSString *fileName=btn.titleLabel.text; 
    fileName=[fileName substringFromIndex:10]; 
    KKMessageCell2 *cell=(KKMessageCell2*)[btn superview]; 
    [[NSNotificationCenter defaultCenter]postNotificationName:@"nPlayAmr" 
            object:nil userInfo:[NSDictionary dictionaryWithObjectsAndKeys: 
                 fileName,@"fileName", 
                 cell,@"cell",nil]]; 
} 

//KKMessageCell2.m 
.... 

-(UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{ 
    static NSString *identifier = @"msgCell"; 
    NSDictionary *dict = [messages objectAtIndex:indexPath.row]; 
    KKMessageCell2 *cell = [[[KKMessageCell2 alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier] autorelease]; 
    cell.selectionStyle = UITableViewCellSelectionStyleNone; 
    [cell setCellView:dict andMy_avatar_url:self.my_avatar_url]; 
    [cell.avatarLeftImageButton addTarget:self action:@selector(pushToUserDetail:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.avatarRightImageButton addTarget:self action:@selector(pushToUserDetail:) forControlEvents:UIControlEventTouchUpInside]; 
    [cell.chatphoto addTarget:self action:@selector(photoClick:) forControlEvents:UIControlEventTouchUpInside]; 
    return cell; 

} 

- (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ 

    [kkcell stopSpeakAmination]; 
    playing=NO; 
} 
+4

Первое, что нужно задать, используете ли вы ARC? – aroth

+1

Ячейка таблицы не выдается при прокрутке экрана, она помещается в очередь повторного использования. Вам действительно нужно опубликовать больше кода, трудно сказать, что вы пытаетесь сделать. – rdelmar

+0

Можете ли вы показать часть кода, в которой вы присваиваете значение 'kkcell' (т. Е.' Kkcell = ...; ')? В фрагменте, который у вас есть, вы пытаетесь использовать его, не присваивая ему ничего в первую очередь. Это будет крутиться почти всегда. – aroth

ответ

1

Преобразование проекта в АРК. Это намного проще и автоматизировано, чем вы думаете. Я преобразовал около 3 проектов в реальной жизни, которые были довольно большими в середине развития и никогда не возникали проблем (отложите один час, чтобы сделать это, вам, вероятно, не понадобится столько времени и его определенно стоит)

в Xcode, выберите edit-> refactor-> convert to Objective-C ARC

Вы также можете найти учебники онлайн, но его довольно прямой вперед в целом.

+0

Спасибо, солидный момент Джош. – Jeremie

0

Ваша программа выходит из строя, скорее всего, потому, что объект действительно был полностью освобожден, но это не значит, что kkcell будет установлены в nil, следовательно, ваши чеки не удается, kkcell является «оборванным».

Чтобы ответить на конкретный вопрос, один способ проверить для выпуска, чтобы переопределить dealloc как в

-(void)dealloc 
{ 
    NSLog(@"deallocated"); 
    [super dealloc]; 
} 

Это может помочь вам устранить говорю вам, когда именно происходит окончательный релиз.