Ios 如何判断对象是否已释放

Ios 如何判断对象是否已释放,ios,objective-c,memory-management,uitableview,Ios,Objective C,Memory Management,Uitableview,如何判断对象是否已释放 如果UITableViewCell已移出屏幕,则UITableView将自动删除kkcell对象 当音频播放器完成时,程序调用“[kkcell StopSpeakanimation]”,但这会导致程序崩溃 - (void)audioPlayerDidFinishPlaying:(AVAudioPlayer *)player successfully:(BOOL)flag{ [kkcell stopSpeakAmination]; playing=NO;

如何判断对象是否已释放

如果UITableViewCell已移出屏幕,则UITableView将自动删除kkcell对象

当音频播放器完成时,程序调用“[kkcell StopSpeakanimation]”,但这会导致程序崩溃

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

    [kkcell stopSpeakAmination];
    playing=NO;
}
我也用

if(kkcell)

但它仍然崩溃

下面是我正在使用的一些代码:

//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;
}

将项目转换为圆弧。这比你想象的要容易得多,自动化程度也高。我已经转换了大约3个现实生活中的项目,这些项目在开发中期相当大,从来没有任何问题(留出一个小时来做,你可能不需要那么多时间,而且绝对值得)

在Xcode中,选择 编辑->重构->转换为目标C圆弧


你也可以在网上找到教程,但总体来说很简单。

将你的项目转换为ARC。这比你想象的要容易得多,自动化程度也高。我已经转换了大约3个现实生活中的项目,这些项目在开发中期相当大,从来没有任何问题(留出一个小时来做,你可能不需要那么多时间,而且绝对值得)

在Xcode中,选择 编辑->重构->转换为目标C圆弧


你也可以在网上找到教程,但总体来说很简单。

你的程序很可能崩溃,因为对象确实完全释放了,但这并不意味着
kkkcell
将被设置为
nil
,因此你的检查失败,
kkcell
处于“悬空”状态

为了回答您的特定问题,测试发布的一种方法是覆盖
dealloc
,如中所示

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

这可能会告诉您最终发布的确切时间,从而帮助您排除故障。

您的程序很可能会崩溃,因为对象确实已完全释放,但这并不意味着
kkkcell
将设置为
nil
,因此检查失败,
kkcell
处于“悬空”状态

为了回答您的特定问题,测试发布的一种方法是覆盖
dealloc
,如中所示

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

这可能会告诉您最终发布的确切时间,从而帮助您排除故障。

首先要问的是,您是否使用ARC?表格视图单元格在屏幕外滚动时不会被释放,而是被放入重用队列。你真的需要发布更多的代码,很难说你想做什么。你能显示你给
kkcell
(即
kkcell=…;
)赋值的代码部分吗?在这里的代码段中,您试图使用它,而不首先为其分配任何内容。这通常会崩溃。这里没有足够的信息,但我的第一个猜测是您从未将
AVAudioPlayer
委托属性设置为
nil
。为了向后兼容,
AVAudioPlayer
delegate属性设置为
assign
(非
weak
),因此如果对象在
AVAudioPlayer
对象释放之前解除分配,则需要手动将其设置为
nil
,你可以做的一个技巧是为你的cell类定义dealloc方法。如果您使用的是ARC,那么您没有[super dealoc];打电话给我。这会让你看到你的手机何时被解除锁定。您还可以在dealloc中输出信息,以标识哪个单元格,这可能会有所帮助。顺便说一句,如果你在kkcell上对nil的测试没有阻止问题的发生,那么很可能你的引用是悬空的。首先要问的是,你在使用ARC吗?一个表视图单元格在屏幕外滚动时不会被释放,它会被放入重用队列。你真的需要发布更多的代码,很难说你想做什么。你能显示你给
kkcell
(即
kkcell=…;
)赋值的代码部分吗?在这里的代码段中,您试图使用它,而不首先为其分配任何内容。这通常会崩溃。这里没有足够的信息,但我的第一个猜测是您从未将
AVAudioPlayer
委托属性设置为
nil
。为了向后兼容,
AVAudioPlayer
delegate属性设置为
assign
(非
weak
),因此如果对象在
AVAudioPlayer
对象释放之前解除分配,则需要手动将其设置为
nil
,你可以做的一个技巧是为你的cell类定义dealloc方法。如果您使用的是ARC,那么您没有[super dealoc];打电话给我。这会让你看到你的手机何时被解除锁定。您还可以在dealloc中输出信息,以标识哪个单元格,这可能会有所帮助。顺便说一句,如果你在kkcell上测试为零并不能阻止问题的发生,那么很可能你的参考文献是悬而未决的。