ARC禁止自动释放?

时间:2013-07-11 21:08:25

标签: iphone ios nsstring

ios的新手并尝试从函数返回NSString。据我所知,我需要[NSString... alloc] init]才能创建返回的字符串。此外,由于我打电话给alloc,我想我必须自己自动发布该对象但是我收到消息“ARC禁止'autorelease'的显式消息发送”所以..我怎么告诉ios我什么时候完成分配的NSString?

- (NSString *) generateUID
{
    char foo[32];
    // create buffer of all capital psuedo-random letters
    for (int i = 0; i < sizeof(foo); i++)
       foo[i] = (random() % 25) + 65; // 0-25 + CAPITAL_A

    NSString *uid = [[NSString alloc] initWithBytes:foo length:sizeof(foo) encoding:NSASCIIStringEncoding];
    NSLog (@"uid: %@", uid);
    return (uid);
}

4 个答案:

答案 0 :(得分:8)

ARC =自动引用计数=编译器根据对代码的分析添加必要的版本和自动回复。你当然不会看到这一点,因为它发生在幕后。正如sosbom在评论中提到的,你真的应该阅读适用的documentation on the Apple website

答案 1 :(得分:3)

你没有。

autorelease只是为了兼容性,在iOS 5之前,您必须这样做:

Thing *myThing = [[Thing alloc] init]; // Retain count: 1
[myArray addObject:myThing];           // Retain count: 2
[myThing release];                     // Retain count: 1

使用上面的代码,保持对象的责任性被赋予数组,当数组被删除时,它将释放它的对象。

或者在自动释放的情况下。

- (MyThing*)myMethod
{
    return [[[MyThing alloc] init] autorelease];
}

然后它会在到达NSAutoReleasePool后释放该对象,并在排出后立即删除。

ARC现在负责照顾它,它几乎为你插入了缺失的部分,所以你不必担心它,它的美妙之处在于你获得引用计数的优势(vs垃圾收集器),代价是增加编译时检查以执行ARC步骤,但最终用户并不关心编译时。

除此之外,您现在拥有strongweak(与非ARC兄弟姐妹retainassign相比,后者仍可用于非保留事情),你得到一个很好的编程经验,而无需用眼睛跟踪代码并计算左手的保留计数。

答案 2 :(得分:1)

简短的回答是你没有! ARC将为您处理内存管理。 当ARC打开时,编译器将插入适当的内存管理语句,例如retain和release消息。

最好使用ARC,因为编译器可以更好地了解对象的生命周期,并且不易出现人为错误。

关于ARC的另一个重要事项。 ARC 与传统垃圾收集相同。在后台没有运行单独的进程或线程,例如java的GC,它在不再引用对象时删除对象。可以将ARC视为编译时垃圾收集:)。

唯一需要注意的是Objective-C和Obj-C ++ / C之间的引用循环和桥接指针/对象。您可能想要查找http://en.wikipedia.org/wiki/Weak_reference

希望这有帮助

答案 3 :(得分:0)

通常,您应该在类中定义构造函数方法,并将alloc逻辑放在该方法中。然后,由于alloc / init方法总是返回(id)并且它不是非常类型安全的,因此制作类型转换错误要困难得多。这就像NSString这样的内置类,例如[NSString stringWithString:@“foo”]。这是一个很好的小块,可以用来编写既可以使用较旧的非弧编译又可以启用弧的代码。

+ (AVOfflineComposition*) aVOfflineComposition
{
  AVOfflineComposition *obj = [[AVOfflineComposition alloc] init];
#if __has_feature(objc_arc)
  return obj;
#else
  return [obj autorelease];
#endif // objc_arc
}

然后声明方法并创建对象的实例,如下所示:

AVOfflineComposition *obj = [AVOfflineComposition aVOfflineComposition];

使用上述方法是最好的,因为它是类型安全的并且具有弧与非弧的相同代码。如果您尝试将返回的对象分配给另一种类型的变量,编译器将会抱怨。