2010-02-02 103 views
2

這是我的問題。NSString基礎 - 內存 - 保留 - 複製

NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"]; 

現在我正在採取其他字符串,如下所示。

NSString *x2=[xyz copy]; 

我真的不知道這裏會發生什麼?
(是不是有點像,X2擁有XYZ的裁判的裁判。)

NSString *x3=[xyz retain]; 

(這裏會發生什麼事,X3具有複製串或[某某副本]新的內存呢嗎?)

現在,如何從內存中刪除所有這三個字符串?

在此先感謝。

sagar。

回答

6
NSString *xyz=[NSString stringWithFormat:@"%i %@",10,@"Sagar"]; 

這將創建的NSString的自動釋放的情況下 - 當自動釋放池被排出(通常在下次運行循環)也將被釋放。

NSString *x2 = [xyz copy]; 

理論上-copy消息將創建對象與保留計數1(也就是你必須某處釋放),但作爲的NSString對象是不可改變的,然後[某某副本]將進行優化,以[XYZ新實例保留],因此它將指向同一個實例。

NSString *x3=[xyz retain]; 

X3將指向同一個實例爲XYZ(和x2),其保留計數將遞增 - 你必須某處釋放你的對象。

現在,如何從內存中刪除所有這三個 字符串?

確保您將所有保留(複製)消息與發佈配對,並釋放內存。
閱讀Objective-c memory management guide瞭解更多詳情。

+1

一個'autoreleased'對象將在下一次被添加到池中時被釋放。對於運行循環的應用程序,應用程序的主池通常會在運行循環的下一次迭代中耗盡。 – dreamlax 2010-02-02 10:22:50

+0

是的夢幻,似乎我需要修改自己的內存管理文檔:) – Vladimir 2010-02-02 10:28:58

+0

Hehehe :),否則一個很好的答案;有一個upvote。 – dreamlax 2010-02-02 10:38:18

3

在像這樣的情況是非常有用自己熟悉的消息命名約定/用Objective-C和可可(和相關框架)的內存管理相關的規則:

你把一個對象的所有權如果您使用名稱爲 以「alloc」或「new」開頭或 包含「copy」(例如alloc, newObject或mutableCopy)的方法創建它,或者 發送它爲保留消息。您是 負責使用 發佈或autorelease放棄 您擁有的對象的所有權。任何其他時間您收到一個對象 ,您一定不能釋放它 。(Memory Management Programming Guide for Cocoa

因此,可以假定,即你是否曾經從對根據上述佈置通過一些其它手段要麼自動釋放或照顧該方案未命名的消息接收的每個對象(它可以定)

通過一些其他的對象等管理的共享對象。如果你只記住這一點,你的問題可以很快地回答:

  1. 你從他的名字做了信息接收的NSString * XYZ不符合上述規則中描述的方案(不是分配,不新,不復制,不保留)。你一定不能發佈它。

  2. 您收到來自名爲copy的消息的NSString * x2。您必須釋放它

  3. 您從名爲retain的消息中收到NSString * x3。你必須釋放它。