2012-08-02 69 views
0

我剛剛弄清楚爲什麼某些代碼剛剛失敗。我有類似於下面的東西:合成屬性未保存

@interface Client : NSObject { 
    Connection *connection; 
} 

@property (retain) NSMutableDictionary *channels; 

跟此實現:

@implementation Client 

@synthesize channels; 

- (id)init 
{ 
    self = [super init]; 
    if (self) { 
     // do whatever I want 
     NSMutableDictionary *dict = [[NSMutableDictionary alloc] init]; 
    } 

    return self; 
} 

任何想法,爲什麼channels有0x0到內存地址在init構造這個類?我無法弄清楚爲什麼會發生這種事。我一定會調用這個構造函數,並且它應該綜合這個屬性讓我可以隨心所欲地做任何事情。

+2

你已經證明初始化'channels',所以我希望它的代碼都不是價值是'0'。你有沒有遺漏一些重要的東西? – 2012-08-02 20:45:05

+0

http://stackoverflow.com/questions/3488446/is-a-synthesized-property-already-alloc-init-ed?rq=1 – hooleyhoop 2012-08-02 20:46:39

+3

'@ synthesize'不會自動爲你分配一個對象。它只是爲該變量創建一個getter和setter。 – wquist 2012-08-02 20:47:34

回答

4

除非您明確將channels設置爲某個值,否則它將保持爲nil。也許您打算在您的init方法中執行以下操作?

if (self) { 
    // do whatever I want 
    channels = [[NSMutableDictionary alloc] init]; 
} 

兩個更多的方式來設置頻道:

[self setChannels:[NSMutableDictionary dictionary]]; //These two lines... 
self.channels = [NSMutableDictionary dictionary]; //...are equivalent. 

注意,在這種情況下,因爲我們使用的是retain存取,我們使用了自動釋放+dictionary,而不是alloc/init,這將泄漏如果不使用ARC。

當然,channels也必須正確發佈-dealloc,如果不使用ARC:

- (void)dealloc 
{ 
    [channels release]; 
} 
+0

這是正確的。我現在很尷尬的愚蠢。這是一個垃圾加載代碼的簡化版本。我怎麼錯過了,我不知道。 – Kezzer 2012-08-02 20:48:54

+0

這些事情發生;也許這個問題對將來有人認爲屬性會自動填充對象是有用的。 – andyvn22 2012-08-02 20:51:38

+0

@ andyvn22,alloc/init只會在不使用ARC時泄漏,如果你也忘記在dealloc中釋放。上面所有的例子都應該有'[channels release];'在不使用ARC的時候釋放(甚至對於保留的屬性)。 – AW101 2012-08-03 20:50:47

1

它爲0x0,因爲你永遠不會設置渠道東西。你至少需要做的:

channels = [[NSMutableDictionary alloc] init]; 

,然後在dealloc中你必須記住:

[channels release]; 
+0

除非我錯了,不使用合成的setter方法,您需要在alloc'd變量上手動調用'retain',不是嗎? – 2012-08-02 20:58:19

+0

不,'alloc'會增加保留計數,所以'retain'不是必需的。如果我也叫'retain',那麼我必須調用'release'兩次。記住:new,alloc,retain和copy都會增加保留計數,所以需要釋放。 – AW101 2012-08-03 20:47:30