簡體   English   中英

為什么我的代碼中不需要保留但它可以工作

[英]Why no retain is needed in my code but it works

我有一個 class

@implementation MyClass

- (void) foo    
{    
    ivar = [NSString stringWithString:@"ivar"];
}

- (void) bar    
{    
    NSLog(@"%@", ivar);
}

和 main.m

MyClass * m = [[MyClass alloc] init];
[m foo];
[m bar];

為什么 stringWithString 不需要保留?

你能告訴我一個需要保留的例子嗎?

這是因為自動釋放池沒有時間耗盡其內容。 這是一個崩潰的例子:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];
MyClass *m = [[MyClass alloc] init];
[m foo];
[pool drain];
[m bar];

在您的示例中保存字符串的自動釋放池屬於當前運行循環的 99%,該運行循環在事件循環開始時創建一個新池,然后在結束時將其排出。

為什么 stringWithString 不需要保留?

因為自動釋放池在第 2 行和第 3 行之間沒有被耗盡(就像在您的代碼將控制權返回給運行循環時它會在 Cocoa 應用程序中一樣)。

您可以先閱讀Memory 管理編程指南並查看教程。

查看 Apple 的Memory 管理規則 在您的情況下,您沒有分配/保留/凈 NSString 因此您不“擁有”它,因此您不需要釋放它。

在內部,NSString 會返回一個自動發布的 object。 如果您不保留它,那么如果它被自動釋放池釋放,您將失去對它的引用。

暫無
暫無

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

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