0

我正在使用 Apple 的 Programming With Objective-C 指南自学 Objective-C 2.0。

我有一个关于我认为是隐式创建的指针的问题。

如果我要重写示例代码:

@implementation XYZShoutingPerson
- (void)saySomething:(NSString *)greeting {
    NSString *uppercaseGreeting = [greeting uppercaseString];
    [super saySomething:uppercaseGreeting];
}
@end

作为

@implementation XYZShoutingPerson
- (void)saySomething:(NSString *)greeting {
    [super saySomething:[greeting uppercaseString]];
}
@end

我会收到一个隐式创建的指向新 NSString 对象的指针吗?如果是这样,指针的范围是什么?

一种方法被认为比另一种更好吗?

4

1 回答 1

0

重写的代码与原始代码基本相同。是的,您将收到来自 的指针[greeting uppercaseString]。我想我们可以说它的范围是 saySomething 方法。由大写字符串返回的字符串将保留计数为 1 并自动释放。在原始代码和您的版本中,除非[super saySomething:]保留其参数(这不太可能),否则将释放大写字符串的结果,然后在弹出自动释放池堆栈的当前帧时释放。出于实际目的(除非您正在管理自己的自动释放池),这意味着大写字符串的结果将在事件循环的当前轮次结束时被释放。

编译器可能足够聪明(尤其是如果您使用 ARC),可以在[super saySomething:]返回后立即释放大写字符串的结果。同样,这在两个版本的代码中都是相同的,原因是[super saySomething:]返回后未使用大写字符串的结果。

于 2013-03-19T16:30:20.023 回答