2012-01-15 6 views
9

गायब हो जाता है मैं कुछ महीनों के लिए कुछ भी काम नहीं करने के बाद कोको विकास में वापस आना शुरू कर रहा हूं। मूल रूप से जब मैंने शुरू किया था तो मैं हिम तेंदुए और एक्सकोड 3 का उपयोग कर रहा था। अब मैं एक्सकोड 4.2 के साथ शेर चला रहा हूं और मैं कुछ मुद्दों पर चल रहा हूं जो मैंने पहले नहीं चला था।NSStatusItem लॉन्च पर संक्षिप्त रूप से प्रकट होता है, लेकिन तुरंत

मुझे विश्वास है कि शायद यह तथ्य है कि मैंने पहले कभी एआरसी का उपयोग नहीं किया है, इसलिए मुझे यकीन है कि मुझे कुछ याद आ रहा है।

मैं मुख्य विंडो या डॉक आइकन के बिना स्टेटसबार एप्लिकेशन बनाने की कोशिश कर रहा हूं। जब मैं एप्लिकेशन चलाता हूं तो मेरे आवेदन के लिए स्टेटसबार आइकन संक्षिप्त रूप से दिखाई देता है, लगभग एक सेकंड के लिए, लेकिन फिर गायब हो जाता है।

मेरा कोड है।

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 छवियों का समर्थन करें, कोड परिवर्तनों के बिना गैर-पीएनजी का समर्थन करें, और पढ़ने में आसान है :) –

+0

@Catfish_Man धन्यवाद! यही वह आलोचना है जिसे मैं ढूंढ रहा हूं! –

उत्तर

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 बनाए रखा जाना का कारण होगा कि। मैं शर्त लगा रहा हूं कि अब क्या हो रहा है कि जब ऑटोरेलीज पूल पॉप हो जाता है तो यह रिलीज़ हो जाता है, और फिर अगली बार जब भी इसे एक्सेस करने का प्रयास होता है तो आपका ऐप क्रैश हो जाता है, जिससे मेनू मेनू से गायब हो जाता है। लाश उपकरण के माध्यम से इसे चलाने से आपको निश्चित रूप से यह बताना होगा कि क्या हो रहा था। लेकिन आम तौर पर, आपके ऐप को इसके लिए चिपकने के लिए उस ऑब्जेक्ट का एक मजबूत संदर्भ होना चाहिए।

+0

धन्यवाद। मैंने संपत्ति को मजबूत में बदल दिया और यह बहुत अच्छा काम करता है। जिस तरह से इसका इरादा था, उसके साथ काम करने के साथ, क्या मुझे अभी भी आईवर को हटा देना चाहिए और संपत्ति के साथ सीधे काम करना चाहिए? इस तरह से ऐसा करने के क्या फायदे होंगे? –

+1

इवर संपत्ति का समर्थन करता है। @ सिंथेसाइज्ड गुणों ने सेटर और गेटर विधियों को उत्पन्न किया है जो स्मृति प्रबंधन आवश्यकताओं को संभालते हैं जिन्हें सबक्लास में ओवरराइड किया जा सकता है। आम तौर पर, मैं कहूंगा कि -init और -dealloc के अलावा कहीं भी सेटटर/गेटटर विधियों का उपयोग करें, जब तक कोई विशिष्ट कारण न हो (जैसे शायद प्रदर्शन यानी तंग लूप)। उस ने कहा, एआरसी अपनी संपत्ति घोषणा से संश्लेषित आईवर के स्मृति प्रबंधन व्यवहार का अनुमान लगाने में सक्षम होना चाहिए, इसलिए ivar का उपयोग करके शायद यह भी काम करना चाहिए, यह मानते हुए कि संपत्ति को 'मजबूत' घोषित किया गया था। – ipmcc

+1

प्री-एआरसी दिनों में, आपको स्मृति प्रबंधन व्यवहार "मुफ्त में" प्राप्त करने के लिए सेटटर/गेटर्स का उपयोग करना होगा। सीधे ivar तक पहुंचने पर आपको मैन्युअल रूप से समकक्ष स्मृति प्रबंधन व्यवहार प्रदान करने की उम्मीद की जाएगी। मैं अभी भी गैर-एआरसी कोडबेस के साथ मुख्य रूप से काम करता हूं, इसलिए वह जगह है जहां मेरी प्रारंभिक टिप्पणी आई थी। – ipmcc

0

मुझे Xamarin में यह समस्या थी। थोड़ी देर के लिए यह ठीक काम किया। फिर मैंने FinishedLaunching विधि में अतिरिक्त कोड जोड़ा और स्टेटसइटम गायब हो गया। मेरे पास यह कोड स्टेटस इटिम उत्पन्न कर रहा था:

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 अपनी अनन्त महिमा :)

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 स्टूडियो पर वापस कॉपी करते समय यह जारी नहीं रहा।

संबंधित मुद्दे