2012-08-24 76 views
0

我創建了一個全局對象,當我的應用程序啓動並設置了一些全局屬性。 我稍後引用ViewController中的其中一個屬性。其他時候,整個應用程序崩潰的時間有時是很好的。Objective-c ARC自動發佈我的對象

我如何告訴ARC不能自動釋放我的對象?

#import "Global.h" 
#import "GeneralHelper.h" 

@implementation Global 

@synthesize orangeClr; 

Global* glob; 

+(void) AppInit 
{  
    glob = [[Global alloc] init]; 
    [glob setStyles]; 
} 
-(void) setStyles 
{ 
    orangeClr = [GeneralHelper colorFromRGBA:255 :102 :0 :1]; 
} 

+(Global*) get { return glob; } 


@end 
+1

您正在寫的代碼對於ObjectiveC程序員來說如此陌生,以至於處於另一個維度,那麼您需要幫助。這是什麼「Global * glob」在你的實現中浮動?如果你想要一個全局的,那麼在你的實現之外創建一個靜態的Glob * glob。您是否閱讀過任何iOS書籍或查看任何代碼? –

+1

不要只說「它崩潰」,這是一個無用的陳述。請明確點。什麼錯誤信息?你是否設置了一個異常斷點,以便Xcode停止錯誤而不是將它們拋出到main()? ARC不會隨意釋放物體。如果確實如此,那麼整個開發者社區都會很憤怒。 – borrrden

+0

請顯示Global.h&GeneralHelper.h的(相關)內容。 「get」無效或「orangeClr」屬性的值返回的值是多少? – CRD

回答

0

使變量變強,如果在文件外部沒有使用變量名,也應該聲明變量是靜態的。

__strong static Global* glob; 
+3

Strong是任何變量的默認值。 –

0

更好的你有單個實例吶,即

static Global* glob = nil; 

+(Global*) SharedInstance 
{ 
    if (!glob) 
    { 
     glob = [[Global alloc] init]; 
     [glob setStyles]; 
    } 
    return glob; 
} 

現在,這可以確保只有一個實例是存在的,通過了應用,你可以釋放這個時候應用是約至終止。 (它是設計模式之一)你可以參考這個類的屬性,從任何viewController,只有第一次它會分配設置樣式。其他時間它只會使用以前的參考。注意它返回全球參考。現在,您的全球課程可以提供許多功能,並且這些功能將處於對象級別,而不是級別級別。

如:

- (void) someFunction; 

可以被稱爲

[[Global SharedInstance] someFunction]; 

而且不要忘了包括Global.h在其他viewControllers

+0

你不應該寫這樣的單身人士,使用dispatch_once – wattson12

+0

其不是上面寫的東西是錯誤的或不應該使用....有其他人分配和初始化的機會...這是一種罕見的情況...可以檢查這一個例子還有很多,這個例子還有很多其他的東西,例如:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CocoaFundamentals/CocoaObjects/CocoaObjects.html#//apple_ref/doc/uid/TP40002974-CH4-SW32 –

+0

代碼比你的,包括重寫發佈和autorelease。dispatch_once更正確,更易於實現,除非你需要支持iOS 4.0以前版本,你應該使用dispatch_once – wattson12

1

另一種方法使用單寫單身派遣:

+(Global *)sharedManager { 
    static dispatch_once_t pred; 
    static Global *shared = nil; 

    dispatch_once(&pred, ^{ 
     shared = [[Global alloc] init]; 
    }); 
    return shared; 
}