2010-06-21 108 views
0

這不像一個沉思的問題 - 爲什麼NSNotificationCenter在發佈時會拋出異常?我對iPhone的發展還不熟悉,因此也不瞭解Cocoa的內涵,所以理解它爲什麼會很好。爲什麼NSNotificationCenter在發佈時會拋出異常?

我分配defaultCenter一個變量,調用的addObserver:選擇:名稱:對象,然後釋放一個變量,而是調用[通知發佈]崩潰的應用程序。我在代碼中沒有做任何奇怪的事情,因此找出它究竟爲什麼這麼做會很有趣。

任何人遇到這個問題?

+0

相關文檔:http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/ – 2010-06-21 18:27:42

回答

5

據我所知NSNotifcation的你不應該分配defaultcenter給一個變量,而是做這樣的事情:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(showLogin) name:@"IncorrectLogin" object:nil]; 

在片斷代碼的調用默認中心和註冊當前對象一定信息。

然後發佈一條消息,通知中心,你可以使用:

[[NSNotificationCenter defaultCenter] postNotificationName:@"IncorrectLogin" object:nil]; 

我用我所有的代碼上面,並沒有與它的任何問題。

2

應該只有一個默認的通知中心爲您的應用程序,所以您的任何類都不應該保留或釋放它。你不希望你的通知中心消失在你身上,對吧?

+0

哦,對,所以我分配一個*引用*然後,而不是一個新的對象。啊,這很有道理。謝謝! – 2010-06-21 16:55:56

1

我不認爲你自己的對象,因此不應該釋放它。

記住NARC:新Alloc,保留,複製。如果你做了其中的一個,你必須釋放它。

+2

建議,因爲@Jamie是Cocoa開發者的新手:永遠不要看着變量的retainCount,它只會導致混淆。有很多有效的原因,保留計數可能與您所期望的不同。只要你遵循適當的內存管理實踐,一切都會按照它應該的那樣工作。 – kubi 2010-06-21 16:55:09

+0

@ Emil的答案的第二部分,關於AllocRetainCopy,雖然是對的。好建議。 – kubi 2010-06-21 16:56:11

+0

是的,內存管理當然是可怕的 - 我正在非常小心地釋放一切,當我完成它 - 保持跟蹤屬性是非常困難的。謝謝! – 2010-06-21 17:01:01

0

這不是你的發佈。

記住NARC規則 - 你只使用釋放你帶來的東西進入存在:

新 分配 保留或 複製。

NARC。看到?

你在用NSNotificationCenter做什麼,你會得到代表默認通知中心的單身人士的副本。這是值得讀的單身人士。

相關問題