2012-01-15 5 views
9

몇 달 동안 아무 작업도하지 않으면 코코아 개발로 돌아 오기 시작합니다. 원래 내가 시작했을 때 저는 Snow Leopard와 Xcode 3을 사용했습니다. 이제 Xcode 4.2로 라이온을 실행 중이며 이전에 실행하지 못한 몇 가지 문제가 있습니다.NSStatusItem이 시작될 때 잠시 나타나지만 즉시 사라집니다.

저는 이전에 ARC를 사용 해본 적이 없다고 생각합니다. 그래서 나는 뭔가를 놓치고 있다고 확신합니다.

주 창이나 도킹 아이콘없이 상태 표시 줄 응용 프로그램을 만들려고합니다. 응용 프로그램을 실행하면 응용 프로그램의 상태 표시 줄 아이콘이 잠시 동안 잠깐 동안 나타나지만 사라집니다.

Heres my code. 당신이 내 코드와 아무 잘못 표시되는 경우

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 

편집 알려 주시기 바랍니다. 나는 내가 더 잘할 수있게하는 약간의 비평을 명확히 할 것이다.

다른 편집 주 창 자체가로드 될 때 상태 표시 줄 아이콘이 사라지는 것처럼 보입니다.

+0

코드에 대한 제안 : 현재 이미지로드 코드 대신 [appBundle imageForResource : @ "statusItemIcon"]을 사용하십시오. 더 빨라지고 @ 2x 이미지를 투명하게 지원하고, 코드를 변경하지 않고 non-png를 지원하고 읽을 수 있어야합니다. –

+0

@Catfish_Man Thank You! 그게 정확히 제가 찾고있는 종류의 비판입니다! –

답변

16

_statusItem은이 경우 자동으로 재생됩니다.

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

이렇게하면 자동 렌더링 된 개체가 반환됩니다. _statusItem은 iVar입니다. 뿐만 아니라,하지만 당신은 할당으로 속성을 선언 :

@property (assign) NSStatusItem *statusItem; 

은 당신이 아마 여기에하고 싶은 재산 strong을 한 후, 대신에 직접 바르를 설정, 그것은을 설정하는 속성을 사용합니다. 이 같은 : 다음

@property (strong) NSStatusItem *statusItem; 

과 :

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

statusItem이 유지 될 일으킬 것이다. 지금 일어나고있는 일은 autorelease 풀이 튀어 나오면 다음 번에 앱이 액세스하려고 할 때 앱이 충돌 할 때 메뉴 바에서 앱이 사라지게된다는 것입니다. 좀비 도구를 통해 실행하면 그 일이 일어 났는지 확실하게 알 수 있습니다. 그러나 일반적으로 응용 프로그램은 객체가 주위를 둘러 쌀 수 있도록 객체에 대한 강력한 참조가 필요합니다.

+0

고맙습니다. 나는 재산을 강하게 바꾸었고 그것은 훌륭하게 작동합니다. 그것이 의도 한대로 작동하면서, 나는 여전히 iVar를 제거하고 직접 부동산과 함께 일해야합니까? 그렇게하는 것의 이점은 무엇입니까? –

+1

ivar이 속성을 백업합니다. @synthesized 속성은 하위 클래스에서 재정의 될 수있는 메모리 관리 요구 사항을 처리하는 setter 및 getter 메서드를 생성합니다. 일반적으로 말하자면 setter/getter 메서드는 -init 및 -dealloc 이외의 다른 곳에서는 사용하지 말아야합니다 (성능과 같이 긴밀한 루프가 아닌 경우). 즉, ARC는 속성 선언에서 합성 된 ivar의 메모리 관리 동작을 추측 할 수 있어야하므로 속성이 '강하다고'선언 된 경우 ivar를 직접 사용하는 것이 좋습니다. – ipmcc

+1

ARC 이전의 날에는 "무료"로 메모리 관리 동작을 얻으려면 setter/getters를 사용해야했습니다. ivar에 직접 액세스 할 때 동등한 메모리 관리 동작을 수동으로 제공해야합니다. 나는 여전히 ARC가 아닌 코드베이스를 주로 사용하기 때문에 초기 주석이 어디에서 왔는지 알 수있다. – ipmcc

0

이 문제는 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; 
    } 

결국 내 문제가 발견되었습니다.내 엑스 코드에서 나는 내 AppDelegate에이 속성을 선언했지만 나는 그것을 사용하지 않은 : 나는 제거 할 때

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

var 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; 
    } 

I에 표시 계속 그것을 (강한) 것으로 바꿀 필요가 없었습니다. 사실 시도했지만 Xamarin Studio로 다시 복사 할 때 지속되지 않았습니다.