簡體   English   中英

iPhone內存管理和陣列

[英]iphone memory management and arrays

我仍在努力圍繞iPhone內存管理工作。 我已經檢查了泄漏情況,但我想確定一下。 這沒有泄漏嗎?

NSMutableArray *array = [[NSMUtableArray alloc] init];
NSMutableString *str = [[NSMutableString alloc]];

[str appendstring:@"hi"];

[array addObject:str];

[str release]; //this is the bit I am most concerned about


...some processing of array occurs...

[array release];

假設您的第二行實際上是這樣的:

NSMutableString *str = [[NSMutableString alloc] init];

然后,是的,沒有泄漏。 當您將字符串添加到數組時,該數組會對該字符串具有所有權權益,因此在隨后的聲明中release該字符串的所有權就可以了。 它仍然按預期存在於數組中。

釋放數組時,它將負責清理自己的引用,包括指向您放入其中的字符串的引用。

大拇指規則,您可以在便利貼上寫上此貼,然后在您的桌面上貼上

如果您是所有者,則分配,新建,初始化或復制的內容是:)

您必須釋放它! 沒有人會為您清理。

**示例:

NSString *releaseMeLaterPlease = [NSString initWithString....];

如果您以示例中的方式創建其他方式,則假定“ bag”是某個數組,

NSString *dontReleaseMe = [bag objectAtIndex:0];

現在,dontReleaseMe不是由alloc,new,init或copy創建的,因此您不會釋放它們。 有人會做。


如果在alloc和init之后使用autorelease,則OS將負責釋放它。


最重要:現在,開發人員不必擔心這些問題!!! Hoooooray! 從iOS5開始自動引用計數

但是,最好學習一下,因為並非所有設備都具有iOS5 :)

祝好運!

quixoto回答了這個問題,但是只是為了明確起見,這是關於每一行代碼中的內存管理的情況:

NSMutableArray *array = [[NSMUtableArray alloc] init];  //array retain count = 1
NSMutableString *str = [[NSMutableString alloc]]; //str retain count = 1

[str appendstring:@"hi"];

[array addObject:str];   //str retain count = 2

[str release]; //str retain count = 1

...some processing of array occurs...

[array release]; //array retain count = 0 & str retain count = 0 .. objects will be removed from memory.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM