Ios 如何判断对象是否已释放
如何判断对象是否已释放 如果UITableViewCell已移出屏幕,则UITableView将自动删除kkcell对象 当音频播放器完成时,程序调用“[kkcell StopSpeakanimation]”,但这会导致程序崩溃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;
- (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上测试为零并不能阻止问题的发生,那么很可能你的参考文献是悬而未决的。