iPhone SDK : UIBarButtonItem not refreshing after Memory warning

标签 iphone uinavigationcontroller uibarbuttonitem memory-warning

我遇到了 UIBarButtonItem 的非常奇怪的行为。

我已经能够在代码已粘贴在下面的测试应用程序中重现该错误。

在我的第一个 View 中,我有一个显示 GUID 的标签、一个用于转到空的第二个 View 的按钮以及一个 UIBarButtonItem。如果我单击它,它的颜色会从绿色变为红色,反之亦然,并且 GUID 会更新。

以下是重现它的方法:

  • 转到第二个 View
  • 发出内存警告(在模拟器硬件菜单中,但与设备上的真实内存警告的作用相同)
  • 返回第一个
  • 单击UIBarButtonItem

UIBarButtonItem 不刷新,即使之前是这样,并且日志显示一切似乎都是正确的。

ViewController.h

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController {
    @private
    BOOL _isGreenNotRed;
}

@property (weak, nonatomic) IBOutlet UIBarButtonItem *aButton;
@property (weak, nonatomic) IBOutlet UILabel *aGUID;
@end

ViewController.m

#import "ViewController.h"
#import "AFHTTPClient.h"
#import "AFHTTPRequestOperation.h"

@interface ViewController ()
- (NSString *)generateUUID;
- (void)refreshView;
@end

@implementation ViewController
@synthesize aButton;
@synthesize aGUID;

- (NSString *)generateUUID
{
    CFUUIDRef theUUID = CFUUIDCreate(NULL);
    CFStringRef string = CFUUIDCreateString(NULL, theUUID);
    CFRelease(theUUID);
    return (__bridge_transfer NSString *)string;
}

-(void)refreshView {
    NSLog(@"Refreshing first view");

    if(self->_isGreenNotRed) {
        [self.aButton setTintColor:[UIColor colorWithRed:0. green:0.8 blue:0. alpha:1.]];
        NSLog(@"Button should be green");
    }
    else {
        [self.aButton setTintColor:[UIColor colorWithRed:0.8 green:0. blue:0. alpha:1.]];
        NSLog(@"Button should be red");
    }

    self->_isGreenNotRed = !self->_isGreenNotRed;

    NSString *guid = [self generateUUID];

    [self.aGUID setText:guid];
    NSLog(@"GUID should be %@", guid);
}

- (IBAction)aButtonClick:(id)sender {
    [self refreshView];
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
    self->_isGreenNotRed = YES;
    [self refreshView];
}

- (void)viewDidUnload
{
    [self setAButton:nil];
    [self setAGUID:nil];
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else {
        return YES;
    }
}

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender {
    NSLog(@"Going to second view");
}

@end

Storyboard:

storyboard

它影响模拟器 5.0 和 5.1,以及 5.1.1 上的设备

编辑:通过记录 self.aButton 的值,我发现由于 weak 关键字,在内存警告后它变成了 nil 。但我怎样才能重新分配它呢? SDK不应该自己做吗?为什么aGUID仍然可用?

编辑:这是一个日志。我们可以看到 aButton 变为 nil。

2012-07-19 14:39:14.716 test[934:f803] Refreshing first view
2012-07-19 14:39:14.718 test[934:f803] Button <UIBarButtonItem: 0x68b89d0> should be green
2012-07-19 14:39:14.719 test[934:f803] GUID label <UILabel: 0x6dbe580; frame = (49 291; 222 48); text = '08960AFD-F98A-4FBA-9A6E-C...'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x6dbe5f0>> should be 08960AFD-F98A-4FBA-9A6E-C548E753F259
2012-07-19 14:39:18.690 test[934:f803] Refreshing first view
2012-07-19 14:39:18.692 test[934:f803] Button <UIBarButtonItem: 0x68b89d0> should be red
2012-07-19 14:39:18.692 test[934:f803] GUID label <UILabel: 0x6dbe580; frame = (49 291; 222 48); text = 'EBB41B52-46D1-4CAE-BF0E-B...'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x6dbe5f0>> should be EBB41B52-46D1-4CAE-BF0E-B0679BC1F0EE
2012-07-19 14:39:19.946 test[934:f803] Refreshing first view
2012-07-19 14:39:19.949 test[934:f803] Button <UIBarButtonItem: 0x68b89d0> should be green
2012-07-19 14:39:19.949 test[934:f803] GUID label <UILabel: 0x6dbe580; frame = (49 291; 222 48); text = '8E802026-E825-4219-9CCA-5...'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x6dbe5f0>> should be 8E802026-E825-4219-9CCA-5106BF65BDA0
2012-07-19 14:39:33.353 test[934:f803] Going to second view
2012-07-19 14:39:40.811 test[934:f803] Received memory warning.
2012-07-19 14:39:43.471 test[934:f803] Refreshing first view
2012-07-19 14:39:43.472 test[934:f803] Button (null) should be green
2012-07-19 14:39:43.473 test[934:f803] GUID label <UILabel: 0x6896570; frame = (49 291; 222 48); text = '3D4933A8-908B-4570-BD55-6...'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x68b0130>> should be 3D4933A8-908B-4570-BD55-68C298F6E621
2012-07-19 14:39:48.649 test[934:f803] Refreshing first view
2012-07-19 14:39:48.650 test[934:f803] Button (null) should be red
2012-07-19 14:39:48.651 test[934:f803] GUID label <UILabel: 0x6896570; frame = (49 291; 222 48); text = '9CDCF065-12C2-4F16-9464-A...'; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x68b0130>> should be 9CDCF065-12C2-4F16-9464-A5CE202BE7CA

最佳答案

内存警告后是否会调用 refreshView

尝试删除 viewDidUnload 中将 View 设置为 nil 的代码?能解决问题吗?

关于iPhone SDK : UIBarButtonItem not refreshing after Memory warning,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11449867/

相关文章:

ios - NSSortDescriptor用于核心数据一对多关系

iphone - 确定分组自定义单元格的 UITableViewCell 宽度的正确方法?

iphone - 如何将 RKObjectMapping (Reskit) 转换为 json 字符串?

swift - 如何快速获取导航栏的字体大小和字体名称?

ios: leftBarButtonItem.target 和 .action

ios - 具有 3 个表的 UINavigationController

ios - 无法将 barbuttonitem 添加到导航 Controller

ios - 呈现 UIAlertViewController 抛出 "View not in window heirarchy"- Swift

ios - 从 UIBarButtonItem 触发 textFieldShouldReturn

ios - 在 UIButton 和 UIToolbar 中使用系统图标?