2

Is the 'reference returned' NSString from the methods:

  • scanString:intoString:
  • scanCharactersFromSet:intoString:
  • scanUpToString:intoString:
  • scanUpToCharactersFromSet:intoString:

in the NSScanner class owned by the calling instance (retain count of 1 and NOT in the autorelease pool) or the NSScanner instance (retain count of 1 and in the autorelease pool)?

If it is the later would not the autorelease pool balloon in size if used to iterate over a list?

4

1 回答 1

2

value参数_

- (BOOL)scanString:(NSString *)string intoString:(NSString **)value;

是Clang ARC 文档中间接参数意义上的“间接参数” :

间接参数

如果函数或方法参数具有 type T*,其中T是所有权不合格的可保留对象指针类型,则:

  • 如果 T 是 const-qualified 或 Class,则使用 __unsafe_unretained 隐式限定它;
  • 否则,它被隐式限定为__autoreleasing.

第二种情况在这里适用。并且__autoreleasing意味着:

对于__autoreleasing对象,新的指针被保留、自动释放并使用原始语义存储到左值中。

Sovalue指向从该函数返回时自动释放的对象。

Xcode 自动补全“知道”这一点并显示

[scanner scanString:(NSString *) intoString:(NSString *__autoreleasing *)]

补充:关于“手动引用计数”,参见《高级内存管理编程指南》中的内存管理策略:

您不拥有通过引用返回的对象

...在这些情况下,适用与已经描述的相同的规则。当您调用任何这些方法时,您不会创建 NSError 对象,因此您不拥有它。因此没有必要释放它,...

于 2013-05-22T19:48:17.513 回答