[英]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.