2012-11-15 44 views
0
@implementation GroupedInexedViewController 
{ 
    NSDictionary *names; 
} 
- (void)viewDidLoad 
{ 
    [super viewDidLoad]; 
    NSString *path = [[NSBundle mainBundle] pathForResource:@"PropertyList" 
               ofType:@"plist"]; 
    NSDictionary *dict = [[NSDictionary alloc] initWithContentsOfFile:path]; 
    names = dict; 
    [dict release]; 
} 

是否釋放'dict'影響'名稱'?我的意思是它是否也釋放了「名稱」?我在另一篇文章中看到,這是一種不好的做法?但爲什麼?Objective C的基本原理C

編輯:ARC被禁用。

回答

1

總之,如果你不使用ARC,是的:釋放dict將影響names。這是因爲您正在將names指針指定給您分配的單個NSDictionary

如果你想有names保留NSDictionary當你的dealloc dict,你需要發送dict一個retain消息:

names = [dict retain]; 
+0

謝謝,我明白了! – Tahlil

0

字典和名稱是兩個不同的變量,不要混合它們!

「釋放」只有當你alloc,copy,mutablecopy,retain。 否則,如果以自動釋放模式創建。

如果你使用ARC,那麼不需要「釋放」編譯器會照顧所有這些新分配的空間。

1

由於您手動調用發佈,我假設您沒有使用自動引用計數(ARC)。

這裏有一些術語混淆。

它不釋放names。當您致電發佈時,您正在遞減參考計數dict。一旦引用計數達到0,內存將被釋放。

問題是您在dictnames之間沒有先撥retaindict

保留一個對象會增加它的引用計數。

您可以選擇將*names一個屬性,它會處理內存管理的你,也可以手動調用保留遞增引用計數:names = [dict retain];

如果你這樣做,你也必須實現方法和releasenames裏面的dealloc方法。

+1

如果我在.h文件中創建了'names',像這樣@property(retain,nonatomic)NSDictionary * names;那麼它會工作嗎?或者當我分配時,我必須做[dict retain]嗎? – Tahlil

+0

@kalkin你混淆了屬性和實例變量(再一次)。 'dict'是一個實例變量,它沒有什麼比保存一個值更特別的。然而'self.dict'是一個isntance變量,在設置時可以要求它保留其底層實例變量。 – 2012-11-15 06:59:53

+0

@ H2CO3:實際上,如果我正確理解@ kalkin的問題,將'.h'中的屬性聲明爲具有retain屬性的'@ property',並在實現文件中將其合理化,然後調用'self.names = dict'將保留價值。 – Alan

1

您的代碼分配names的值爲dictdict是一個指向對象的指針,因此當您將其值分配給另一個指針(names)時,兩個指針都引用相同的對象並且可以認爲是相同的。

所以是的,當你發佈dict時,你也發佈了names

BTW,可以分配給names的情況下直接通過dict打算:

names = [[NSDictionary alloc] initWithContentsOfFile:path]; 

如果你可以啓用ARC,你永遠不必擔心釋放的對象。

+0

我現在明白了,謝謝! – Tahlil

1

沒有答案看似很遠談不上ARC和非ARC的區別(MRC)用法屬性和實例變量之間的差異。

首先,屬性實際上只是實例變量支持的setter和getter方法。當您將物業設置爲self.dict = someObject;並且該物業被宣佈爲strongretain時,則保留someObject。但是,如果你只有一個實例變量(不是屬性),並且你正在使用MRC,那麼只需要寫dict = someObject;只複製指針,但不會增加引用計數 - 如果在此之後編寫[someObject release],則應該假設dict也被無效(即使這兩個指針指向的對象實際上未被釋放 - 這是一個引用計數規則)。

如果使用ARC,然後分配給一個變量增加了一個引用計數,以及 - 所以,如果someObject有1引用計數,然後寫dict = someObject;會增加對象的引用計數(今指出dictsomeObject)爲2.

+0

如果他手動調用'release',他不使用ARC。 – Alan

+0

@Alan和上帝保存一個初學者使用ARC!但如果他後來想繼續前進,那麼讓他有一個參考。我解釋的東西比他要求的更多嗎? – 2012-11-15 07:10:36

+1

當然不壞。內存是Objective-C中一個令人毛骨悚然的話題,大多數開發人員一開始就會遇到困難。 ARC使它變得更好,但同時使事情變得更加混亂(一個答案提到,用ARC你永遠不必釋放一個對象 - 這根本不是真的)。 – Alan