ARC禁止autorelease?

新来ios并试图从一个函数返回一个NSString。 据我所知,我需要[NSString... alloc] init]为了创build返回的string。 此外,因为我叫alloc ,我想我必须自动autorelease对象,但是我收到消息“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); } 

ARC =自动引用计数=编译器根据对代码的分析添加必要的版本和自动回复。 你当然不会看到这个,因为它发生在幕后。 正如sosbom在他的评论中提到的,你应该阅读苹果网站上的适用文档 。

你没有。

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

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

通过上面的代码,保存对象的责任被赋予给数组,当数组被删除时,它将释放它的对象。

或者在autorelease的情况下。

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

然后一旦它到达一个NSAutoReleasePool,它就会释放这个对象,一旦被抽干就会被移除。

ARC现在照顾好了,它几乎为你插入了缺失的部分,所以你不必担心它,它的美丽在于你得到了引用计数(vs垃圾收集器)的优势,在增加编译时检查来完成ARC步骤的代价,但最终用户不关心编译时间。

除此之外,你现在拥有strongweak (相对于非ARC的兄弟姐妹retainassign ,后者对于非保留的东西仍然有用),并且在不追踪代码的情况下获得良好的编程经验并计数保留在你左边。

简短的回答是你不! ARC将为您处理内存pipe理。 当ARC打开时,编译器将插入适当的内存pipe理语句,如保留和释放消息。

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

还有一件重要的事情要注意ARC。 ARC与传统的垃圾收集一样。 没有单独的进程或线程在后台运行,例如java的GC,当不再引用它们时删除对象。 人们可以将ARC视为编译时垃圾收集:)。

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

希望这可以帮助

一般来说,你应该在你的类中定义一个构造函数方法,并将alloc逻辑放在该方法中。 然后,由于alloc / init方法总是返回(id),并且它不是非常安全的types,因此很难进行types转换错误。 例如,像NSS​​tring这样的内置类就像[NSString stringWithString:@“foo”]一样。 这是一个很好的小块,你可以使用它来编写既适用于老版本的无弧编译又适用于arc的代码。

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

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

 AVOfflineComposition *obj = [AVOfflineComposition aVOfflineComposition]; 

使用上述方法是最好的,因为它是types安全的,并且具有弧与非弧的相同的代码。 如果您尝试将返回的对象分配给另一个types的variables,编译器会投诉。