0

我有一个 UIViewController。我使用 navigationItem 的 rightBarButtonItem 作为“重新加载按钮”。当按下重新加载按钮时,我使用 leftBarButtonItem 在应用程序处理要重新加载的数据时显示活动指示器。到这里为止一切都很好。
这是一些代码:

- (void)initSpinner {
    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    activityButton = [[UIBarButtonItem alloc] initWithCustomView: activityIndicator];
    self.navigationItem.leftBarButtonItem = activityButton;
}

- (void)spinBegin {
    [activityIndicator startAnimating];
}

- (void)spinEnd {
    [activityIndicator stopAnimating];
}
- (void)viewDidLoad {
     [self initSpinner];
     [super viewDidLoad];
    //more stuff going on here....
}
-(void) loadView{
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshFeeds:)];
}

现在我被要求稍微改变逻辑。
rightBarButtonItem 保持原样。leftBarButtonItem 仍然在那里显示活动指示器,但是当没有处理时,它应该显示另一个按钮,当按下时将显示一个新视图(用于某些信息)。
所以我做了这些改变:

- (void)initSpinner {
    activityIndicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhite];
    activityButton = [[UIBarButtonItem alloc] initWithCustomView: activityIndicator];
}

- (void)spinBegin {
    self.navigationItem.leftBarButtonItem = activityButton;
    [activityIndicator startAnimating];
}

- (void)spinEnd {
    [activityIndicator stopAnimating];
     self.navigationItem.leftBarButtonItem =infoBarButton; //= [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshFeeds:)] autorelease];
}
-(void) loadView{
    self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemRefresh target:self action:@selector(refreshFeeds:)];

    if (infoBarButton == nil){
        UIImage *buttonImage = [UIImage imageNamed:@"info.png"];
        UIButton *aButton = [UIButton buttonWithType:UIButtonTypeCustom];
        [aButton setImage:buttonImage forState:UIControlStateNormal];
        aButton.frame = CGRectMake(0.0, 0.0, 25, 25);

        // Initialize the UIBarButtonItem
        infoBarButton = [[UIBarButtonItem alloc] initWithCustomView:aButton];

        // Set the Target and Action for aButton
        [aButton addTarget:self action:@selector(showInfo:) forControlEvents:UIControlEventTouchUpInside];


    }
    self.navigationItem.leftBarButtonItem = infoBarButton;
}

虽然它似乎正在工作(信息按钮在那里,当我按下“重新加载”时,activityIndi​​cator 会占据它的位置,直到处理完成),我在调试器控制台中得到以下信息:

__NSAutoreleaseNoPool(): Object 0x15ef30 of class UINavigationItem autoreleased with no pool in place - just leaking
 __NSAutoreleaseNoPool(): Object 0x1abd90 of class UIBarButtonItem autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x1acb20 of class UIButton autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x15ef30 of class UINavigationItem autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x1ad030 of class UIActivityIndicatorView autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x1ad030 of class UIActivityIndicatorView autoreleased with no pool in place - just leaking
__NSAutoreleaseNoPool(): Object 0x1a8c40 of class UINavigationButton autoreleased with no pool in place - just leaking
Object 0x941c of class NSCFString autoreleased with no pool in place - just leaking
//MORE similar messages following...

我究竟做错了什么?我希望有人可以提供帮助...
在此先感谢。

4

2 回答 2

0

你的属性被retain编辑了吗?您正在做,alloc] init...但在将它们分配给您的属性后没有释放它们。我建议查看内存管理指南

于 2011-05-24T14:36:01.240 回答
0

我的猜测是你正在后台线程中运行“重新加载”任务,当它完成时你spinEnd从后台线程调用。如果后台线程没有适当的自动释放池,您将看到这些警告。

由于您应该只UIKit从主线程调用方法,因此您应该spinEnd通过以下方式调用:

[self performSelectorOnMainThread:@selector(spinEnd) withObject:nil waitUntilDone:NO];
于 2011-05-24T14:37:20.070 回答