2010-11-14 89 views
2

我正在學習這個交易,目前正在關注NSDictionary。我目前正在從「開始探索iPhone SDK的iPhone開發」一書(Dave Mark/jeff LaMarche)中做例子。NSDictionary,爲什麼是這個

我正在使用的例子是在第7章(第166頁),選項卡欄和選取器中。

我想問他們爲什麼要像他們那樣使用字典。

下面是這種情況:

在.h文件

的NSDictionary * stateZips;

的.m文件(viewDidLoad中)它們有以下代碼:

的NSDictionary *詞典= [[NSDictionary中的alloc] initWithContentsOfFile:plistPath];
self.stateZips = dictionary;
[字典發佈];

我的問題是,如果有,爲什麼他們的字典複製到stateZips,而不是使用stateZips從plist中給init,以避免額外的代碼進行任何具體的Objective-C的原因是什麼? ......或者如果這只是作家自己的做事方式?

+1

你知道你可以接受答案,對吧? – 2010-11-14 11:50:29

+0

借調。接受正確的答案是適當的禮節。 – 2010-11-14 11:54:18

回答

2

.m文件是否也有stateSips的@synthesize語句?我猜測它有,因爲分配的風格。

如果有一個財產申報與保留,以及stateZips一個@synthesize聲明,你這樣做:

self.stateZips = [[NSDictionary alloc] initWithContentsOfFile:plistPath]; 

你將有一個內存泄漏。在上述聲明中創建的字典在聲明後的保留數爲2。一個保留alloc,一個保留由合成的setter執行。

這是使用包含保留報表制定者的一個側面影響,但如果你不使用與保留報表制定者,你可能有很多更大的內存管理的問題... ;-)

爲了更好地理解這些東西你應該研究使用@屬性的賦值和保留以及合成setters和getters後面的代碼。

0

因爲我認爲stateZips是一個屬性保留。
因此,當他們分配/ initWithContentsOfFile字典,他們需要釋放它,因爲self.stateZips已經保留它。

+0

正確,雖然我沒有看到他們爲什麼使用setter的原因(它沒有任何幫助,只是使用性能的方法查找)... – JustSid 2010-11-14 11:35:24

+0

呃如何接受答案? – PeterK 2010-11-14 12:14:07

+0

我剛剛學會如何接受:-) – PeterK 2010-11-14 12:22:49