Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c NSStatusItem在启动时短暂出现,但立即消失_Objective C_Cocoa_Automatic Ref Counting_Nsstatusbar - Fatal编程技术网

Objective c NSStatusItem在启动时短暂出现,但立即消失

Objective c NSStatusItem在启动时短暂出现,但立即消失,objective-c,cocoa,automatic-ref-counting,nsstatusbar,Objective C,Cocoa,Automatic Ref Counting,Nsstatusbar,在几个月没有做任何事情之后,我开始重新从事可可开发。起初,我使用雪豹和Xcode 3。我现在使用Xcode 4.2运行Lion,遇到了一些以前从未遇到过的问题 我相信这可能是因为我以前从未使用过ARC,所以我肯定我遗漏了一些东西 我正在尝试创建没有主窗口或停靠图标的状态栏应用程序。当我运行应用程序时,我的应用程序的状态栏图标会短暂出现约一秒钟,然后消失 这是我的密码 quickplus.h 编辑如果您发现我的代码有任何错误,请告诉我。我肯定会提出一些批评,这样我会变得更好 另一次编辑当主窗口本身

在几个月没有做任何事情之后,我开始重新从事可可开发。起初,我使用雪豹和Xcode 3。我现在使用Xcode 4.2运行Lion,遇到了一些以前从未遇到过的问题

我相信这可能是因为我以前从未使用过ARC,所以我肯定我遗漏了一些东西

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

这是我的密码

quickplus.h

编辑如果您发现我的代码有任何错误,请告诉我。我肯定会提出一些批评,这样我会变得更好


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

\u在这种情况下,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被保留。我敢打赌,现在发生的事情是,当自动释放池弹出时,它会被释放,然后你的应用程序在下次有人试图访问它时崩溃,从而导致它从菜单栏中消失。通过僵尸仪器运行它会告诉你是否发生了这种情况。但总的来说,你的应用程序需要有一个对该对象的强引用,这样它才能继续运行

我在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;
当我移除
var
时,StatusItem继续显示出它无限的荣耀:)


我不必把它改成(strong)。事实上,我尝试过,但在复制回Xamarin Studio时,它没有持续。

对代码的建议:使用[appBundle imageForResource:@“statusItemIcon”]而不是当前的图像加载代码。它应该更快,支持@2x透明图像,支持非png而不更改代码,并且更易于阅读:)@Catfish_Man谢谢!这正是我想要的批评!非常感谢。我将属性改为strong,效果非常好。如果它按照预期的方式工作,我是否仍应移除iVar并直接处理该财产?这样做的好处是什么?ivar支持财产@综合属性生成了setter和getter方法,用于处理可以在子类中重写的内存管理需求。一般来说,我会说除了-init和-dealoc之外,在任何地方都可以使用setter/getter方法,除非有特定的理由不这样做(比如性能,即紧循环)。这就是说,ARC应该能够从属性声明中推断出合成ivar的内存管理行为,因此直接使用ivar也应该可以工作,假设属性声明为
strong
。在ARC之前的日子里,您必须使用setter/getter“免费”获得内存管理行为直接访问ivar时,您需要手动提供等效的内存管理行为。我仍然主要使用非ARC代码库,所以这就是我最初评论的来源。
    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;
    }
@property(nonatomic, retain) IBOutlet NSStatusItem *statusItem;
    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;
    }