如何释放自我启动的对象

时间:2016-12-15 06:58:17

标签: objective-c automatic-ref-counting

编写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. 我应该如何在(1)中释放tmpAttributedString,只有一个NSAttributedString指针而没有(2)中的临时NSString?可能吗? (第二个init取决于第一个init。)

  2. 编译器在方案(1)中会做什么?我的意思是ARC如何为它插入释放/自动释放?如果启用ARC,是否存在(1)中的内存泄漏? (当然用ARC删除了release的显式调用。)

  3. 谢谢!

1 个答案:

答案 0 :(得分:0)

ARC的规则相对简单。如果您致电allocnewcopy,那么ARC了解当该对象超出范围时,需要在此对象上调用release。假设所有其他对象为autoreleased。 “超出范围”意味着返回或重新分配变量。在看到变量重新分配的情况下,它会在将release调用分配给其他内容之前隐式地进行调用。如果返回一个变量,ARC将对该变量进行autorelease调用,以使其可以超出该方法的范围;任何其他未返回但仍然存在的现有变量(未自动释放)将向其发送隐式release

Apple's official transition guide供参考。