0

ios 新手并尝试从函数返回 NSString。据我了解,我需要[NSString... alloc] init]创建用于返回的字符串。另外,因为我打电话alloc,我想我必须自己自动释放对象但是我收到消息“ARC 禁止显式发送'autorelease'的消息”所以..当我完成分配的 NSString 后如何告诉 ios ?

- (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

4 回答 4

8

ARC = 自动引用计数 = 编译器根据对代码的分析添加必要的发布和自动发布。你当然看不到这一点,因为它发生在幕后。正如 sosbom 在他的评论中提到的,您确实应该阅读Apple 网站上的适用文档

于 2013-07-11T21:14:24.140 回答
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 现在会处理这个问题,它几乎会为您插入缺失的部分,因此您不必担心它,它的美妙之处在于您获得了引用计数(与垃圾收集器相比)的优势,在增加编译时间检查以执行 ARC 步骤的成本,但您的最终用户并不关心编译时间。

再加上,您现在拥有strongand weak(与他们的非 ARC 同级retainassign,后者对非保留的东西仍然有用),并且您无需用眼睛跟踪代码并计算保留计数即可获得良好的编程体验你的左手。

于 2013-07-11T21:15:40.633 回答
1

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

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

关于 ARC 的另一件重要的事情要注意。ARC传统的垃圾收集不同。没有单独的进程或线程在后台运行,就像 java 的 GC 一样,它会在不再引用对象时删除对象。可以将 ARC 视为编译时垃圾收集 :)。

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

希望这可以帮助

于 2013-07-11T21:15:22.513 回答
0

一般来说,你应该在你的类中定义一个构造方法,并将分配逻辑放在那个方法中。然后,由于 alloc/init 方法总是返回 (id) 并且它不是非常安全的类型,因此很难产生类型转换错误。这就是像 NSString 这样的内置类所做的,例如 [NSString stringWithString:@"foo"]。这是一个不错的小块,您可以使用它来编写既适用于较旧的非 arc 编译又适用于启用 arc 的代码。

+ (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];

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

于 2013-07-11T22:07:54.510 回答