objective-c – NSStatusItem在启动时短暂出现,但会立即消失

前端之家收集整理的这篇文章主要介绍了objective-c – NSStatusItem在启动时短暂出现,但会立即消失前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
在几个月内没有任何工作后,我开始回到可可发展.最初当我开始使用Snow Leopard和 Xcode 3.我现在正在使用 Xcode 4.2运行Lion,而且我遇到了一些我以前没有遇到过的问题.

我相信这可能是我以前从未使用ARC的事实,所以我确定我错过了一些事情.

我正在尝试创建状态栏应用程序,没有主窗口或停靠图标.当我运行应用程序时,我的应用程序的状态栏图标会短暂显示约一秒钟,但会消失.

我的代码

QuickPlusAppDelegate.h

#import <Cocoa/Cocoa.h>

@interface QuickPlusAppDelegate : NSObject <NSApplicationDelegate>

@property (assign) IBOutlet NSWindow *window;
@property (assign) NSStatusItem *statusItem;
@property (weak) IBOutlet NSMenu *statusItemMenu;

@property (strong) NSImage *statusItemIcon;
@property (strong) NSImage *statusItemIconHighlighted;
@property (strong) NSImage *statusItemIconNewNotification;

@end

QuickPlusAppDelegate.m

#import "QuickPlusAppDelegate.h"

@implementation QuickPlusAppDelegate
@synthesize statusItemMenu = _statusItemMenu;

@synthesize window = _window,statusItem = _statusItem;
@synthesize statusItemIcon = _statusItemIcon,statusItemIconHighlighted = _statusItemIconHighlighted,statusItemIconNewNotification = _statusItemIconNewNotification;

- (void) awakeFromNib
{
    NSBundle *appBundle = [NSBundle mainBundle];
    _statusItemIcon = [[NSImage alloc] initWithContentsOfFile:[appBundle pathForResource:@"statusItemIcon" ofType:@"png"]];
    _statusItemIconHighlighted = [[NSImage alloc] initWithContentsOfFile:[appBundle pathForResource:@"statusItemIconHighlighted" ofType:@"png"]];
    _statusItemIconNewNotification = [[NSImage alloc] initWithContentsOfFile:[appBundle pathForResource:@"statusItemIconNewNotification" ofType:@"png"]];

    _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];
    [_statusItem setImage:_statusItemIcon];
    [_statusItem setAlternateImage:_statusItemIconHighlighted];
    [_statusItem setHighlightMode:YES];
}

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification
{
    // empty
}

@end

编辑如果看到我的代码有问题,请让我知道.我肯定会有一些批评,所以我可以变得更好.

另一个编辑当主窗口本身加载时,状态栏图标似乎消失.

解决方法

在这种情况下,_statusItem将被自动释放.
_statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];

这返回一个自动释放的对象. _statusItem只是一个iVar.不仅如此,您将该属性声明为assign:

@property (assign) NSStatusItem *statusItem;

你可能想在这里做的是使属性强,然后,而不是直接设置ivar,使用属性来设置它.所以这样:

@property (strong) NSStatusItem *statusItem;

接着:

self.statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];

这将导致statusItem被保留.我敢打赌,现在发生的情况是,当自动释放池弹出时,它会被释放,然后在下次尝试访问它的应用程序崩溃时,导致它从菜单栏中消失.通过僵尸仪器运行它会告诉你,如果这是发生了什么事情.但是一般来说,你的应用程序需要有一个强有力的参考,以便它坚持下去.

猜你在找的C&C++相关文章