在几个月内没有任何工作后,我开始回到可可发展.最初当我开始使用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被保留.我敢打赌,现在发生的情况是,当自动释放池弹出时,它会被释放,然后在下次尝试访问它的应用程序崩溃时,导致它从菜单栏中消失.通过僵尸仪器运行它会告诉你,如果这是发生了什么事情.但是一般来说,你的应用程序需要有一个强有力的参考,以便它坚持下去.