11

数か月間何も作業をしなかった後、私は Cocoa 開発に戻り始めています。始めた当初は、Snow Leopard と Xcode 3 を使用していました。現在、Xcode 4.2 で Lion を実行していますが、これまで遭遇したことのない問題に直面しています。

おそらく、これまで ARC を使用したことがないため、何かが欠けていると確信しています。

メイン ウィンドウまたはドック アイコンなしで、Statusbar アプリケーションを作成しようとしています。アプリケーションを実行すると、アプリケーションのステータスバー アイコンが短時間 (約 1 秒間) 表示されますが、その後消えます。

これが私のコードです。

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

編集私のコードに何か問題がある場合は、お知らせください。私は間違いなくいくつかの批評をして、私がより良くなることができるようにします.

別の編集メインウィンドウ自体がロードされると、ステータスバーアイコンが消えるようです。

4

2 に答える 2

22

この場合、_statusItem は自動解放されます。

    _statusItem = [[NSStatusBar systemStatusBar] statusItemWithLength:NSVariableStatusItemLength];

これは自動解放されたオブジェクトを返します。_statusItem は単なる iVar です。それだけでなく、プロパティを assign として宣言します。

@property (assign) NSStatusItem *statusItem;

ここでおそらくやりたいことは、プロパティstrongを作成してから、ivar を直接設定する代わりに、プロパティを使用して設定することです。このように:

@property (strong) NSStatusItem *statusItem;

その後:

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

これにより、statusItem が保持されます。今起こっていることは、自動解放プールがポップしたときに解放され、次に何かがそれにアクセスしようとしたときにアプリがクラッシュし、メニューバーから消えてしまうことだと思います. Zombies インストゥルメントを実行すると、それが起こっているかどうかが確実にわかります。ただし、一般に、アプリがそのオブジェクトに固執するためには、そのオブジェクトへの強力な参照が必要です。

于 2012-01-15T21:51:13.777 に答える
2

私はXamarinでこの問題を抱えていました。しばらくの間、それはうまくいきました。次に、メソッドに追加のコードを追加FinishedLaunchingすると、StatusItem が消え始めました。StatusItemを生成するこのコードがありました:

    public override void AwakeFromNib ()
    {
        var statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (30);
        statusItem.Menu = mainMenu;
        statusItem.Image = NSImage.ImageNamed ("menuicon");
        statusItem.AlternateImage = NSImage.ImageNamed ("menuicon_selected");
        statusItem.HighlightMode = true;
    }

最終的に、私は自分の問題を見つけました。私の Xcode では、AppDelegate でこのプロパティを宣言しましたが、使用していませんでした。

@property(nonatomic, retain) IBOutlet NSStatusItem *statusItem;

varStatusItemを削除すると、その無限の栄光が表示され続けました:)

    public override void AwakeFromNib ()
    {
        statusItem = NSStatusBar.SystemStatusBar.CreateStatusItem (30);
        statusItem.Menu = mainMenu;
        statusItem.Image = NSImage.ImageNamed ("menuicon");
        statusItem.AlternateImage = NSImage.ImageNamed ("menuicon_selected");
        statusItem.HighlightMode = true;
    }

(強)に変える必要はありませんでした。実際に試してみましたが、Xamarin Studio にコピーし直しても持続しませんでした。

于 2015-03-02T15:45:01.597 に答える