编写Objective-C时,即使在ARC的帮助下,了解内存管理方式也很重要。
以下是代码段(非ARC):
(1)
NSAttributedString *tmpAttrbutedString = [[NSAttributedString alloc] initWithString:@"foo" attributes:@{NSFontAttributeName:[NSFont fontWithName:@"Heiti SC" size:13.0f]}];
// how should I release tmpAttributedString here?
tmpAttributedString = [[NSAttributedString alloc] initWithString:tmpAttributedString.string attributes:@{NSForegroundColorAttributeName:[NSColor redColor]}];
[tmpAttributedString release];
以下是我目前为避免内存泄漏所做的工作:
(2)
NSAttributedString *tmpAttrbutedString = [[NSAttributedString alloc] initWithString:@"foo" attributes:@{NSFontAttributeName:[NSFont fontWithName:@"Heiti SC" size:13.0f]}];
NSString *tmpString = tmpAttrbutedString.string;
[tmpAttrbutedString release];
tmpAttributedString = [[NSAttributedString alloc] initWithString:tmpString attributes:@{NSForegroundColorAttributeName:[NSColor redColor]}];
[tmpAttributedString release];
我的问题是:
我应该如何在(1)中释放tmpAttributedString
,只有一个NSAttributedString
指针而没有(2)中的临时NSString
?可能吗? (第二个init
取决于第一个init
。)
编译器在方案(1)中会做什么?我的意思是ARC如何为它插入释放/自动释放?如果启用ARC,是否存在(1)中的内存泄漏? (当然用ARC删除了release
的显式调用。)
谢谢!
答案 0 :(得分:0)
ARC的规则相对简单。如果您致电alloc
,new
或copy
,那么ARC了解当该对象超出范围时,需要在此对象上调用release
。假设所有其他对象为autoreleased
。 “超出范围”意味着返回或重新分配变量。在看到变量重新分配的情况下,它会在将release
调用分配给其他内容之前隐式地进行调用。如果返回一个变量,ARC将对该变量进行autorelease
调用,以使其可以超出该方法的范围;任何其他未返回但仍然存在的现有变量(未自动释放)将向其发送隐式release
。