首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >UIActivityIndicatorView总是崩溃

UIActivityIndicatorView总是崩溃
EN

Stack Overflow用户
提问于 2011-06-07 04:43:11
回答 2查看 1.7K关注 0票数 0

我的UIActivityIndicatorView总是让我的应用崩溃。

当我按下下载按钮时,指示器显示并开始旋转。

但当我停下来的时候,我只需要触摸屏幕的某个地方,我的应用程序就会崩溃。

.h

代码语言:javascript
复制
@interface DownloadViewController : UIViewController < FinishedParsing, NSFetchedResultsControllerDelegate > 
{
    UIActivityIndicatorView* indicator;
}
@property (nonatomic, retain) UIActivityIndicatorView* indicator;

- (void)initSpinner;
- (void)spinBegin;
- (void)spinEnd;

.m

代码语言:javascript
复制
@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];
    ...
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-06-07 04:47:16

而不是自动释放它,而是控制它,并在完成后通过调用self.indicated = nil手动释放它,并在dealloc中释放它。那样的话,你肯定它不会在没有警告的情况下消失。

票数 3
EN

Stack Overflow用户

发布于 2011-06-07 06:00:11

在您的函数中:

代码语言:javascript
复制
- (void)spinEnd {
    [indicator stopAnimating];
    self.indicator = nil;
}

我建议不要将指示器设置为零。实际上,设置self.indicator = nil将使该指标被释放。如果这也会触发释放,则在执行主循环时,UI可能无法正确地重新绘制自身。注意:这只是我的一个假设,因为你有奇怪的行为。它可能起作用,也可能不起作用。

我还会确保在指示器停止时将hidesWhenStopped设置为YES。总而言之,我会重写:

代码语言:javascript
复制
- (void)spinEnd {
    self.indicator.hidesWhenStopped = YES; //-- additional guarantee, but it should already be set
    [indicator stopAnimating];
}

并在-dealloc中发布indicator

代码语言:javascript
复制
- (void)dealloc {
    ....
    [_indicator release];
    _indicator = nil;
    ...
    [super dealloc];
}

顺便说一句,还要修复initSpinner中的内存泄漏

代码语言:javascript
复制
- (void)initSpinner {
    self.indicator = [[[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge] autorelease];    
    ....

需要注意的是,当您执行initSpinner时,如果一个indicator已经存在,那么将一个新的UIActivityIndicatorView分配给self.indicator将使上一个被释放。

编辑:

如果以上方法都不起作用,您可以再尝试两种方法:

-spinEnd;

  • possibly I中将indicator hidden属性设置为YES是错误的,但我突然想到在调用[indicator stopAnimating];

之前设置self.indicator.hidesWhenStopped = YES可能会更有效

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6257809

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档