我的UIActivityIndicatorView总是让我的应用崩溃。
当我按下下载按钮时,指示器显示并开始旋转。
但当我停下来的时候,我只需要触摸屏幕的某个地方,我的应用程序就会崩溃。
.h
@interface DownloadViewController : UIViewController < FinishedParsing, NSFetchedResultsControllerDelegate >
{
UIActivityIndicatorView* indicator;
}
@property (nonatomic, retain) UIActivityIndicatorView* indicator;
- (void)initSpinner;
- (void)spinBegin;
- (void)spinEnd;.m
@implementation DownloadViewController
@synthesize indicator;
- (IBAction)download:(id)sender
{
[self initSpinner];
[self spinBegin];
[OJSGatewayCommunicationService parseArticles :self];
}
- (void)initSpinner
{
self.indicator = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge]autorelease];
// we put our spinning "thing" right in the center of the current view
CGPoint newCenter = (CGPoint) [self.view center];
indicator.center = newCenter;
[self.view addSubview:indicator];
}
- (void)spinBegin
{
[indicator startAnimating];
}
- (void)spinEnd
{
self.indicator.hidesWhenStopped = YES;
[indicator stopAnimating];
indicator.hidden = TRUE;
[indicator removeFromSuperview];
}
- (void) fetchPDF:(NSMutableArray *)chapters
{
[self spinEnd];
...
}发布于 2011-06-07 04:47:16
而不是自动释放它,而是控制它,并在完成后通过调用self.indicated = nil手动释放它,并在dealloc中释放它。那样的话,你肯定它不会在没有警告的情况下消失。
发布于 2011-06-07 06:00:11
在您的函数中:
- (void)spinEnd {
[indicator stopAnimating];
self.indicator = nil;
}我建议不要将指示器设置为零。实际上,设置self.indicator = nil将使该指标被释放。如果这也会触发释放,则在执行主循环时,UI可能无法正确地重新绘制自身。注意:这只是我的一个假设,因为你有奇怪的行为。它可能起作用,也可能不起作用。
我还会确保在指示器停止时将hidesWhenStopped设置为YES。总而言之,我会重写:
- (void)spinEnd {
self.indicator.hidesWhenStopped = YES; //-- additional guarantee, but it should already be set
[indicator stopAnimating];
}并在-dealloc中发布indicator
- (void)dealloc {
....
[_indicator release];
_indicator = nil;
...
[super dealloc];
}顺便说一句,还要修复initSpinner中的内存泄漏
- (void)initSpinner {
self.indicator = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] autorelease];
....需要注意的是,当您执行initSpinner时,如果一个indicator已经存在,那么将一个新的UIActivityIndicatorView分配给self.indicator将使上一个被释放。
编辑:
如果以上方法都不起作用,您可以再尝试两种方法:
在-spinEnd;
hidden属性设置为YES是错误的,但我突然想到在调用[indicator stopAnimating];
之前设置self.indicator.hidesWhenStopped = YES可能会更有效
https://stackoverflow.com/questions/6257809
复制相似问题