【问题标题】:NSString basics clarification [duplicate]NSString 基础说明 [重复]
【发布时间】:2011-12-30 07:23:28
【问题描述】:

可能重复:
NSString retain Count

我是 iPhone 编程的初学者。我正在处理 NSString。我在下面解释了一个疑问。

@implementation Sample;

NSString *str;

-(void)viewDidLoad
{
    str = [[NSString alloc] initWithString:@"Hello"];

    // Why retain count is some random value? (Eg.2147234)
    NSLog(@"retain count of string %d",[str retainCount]);

    [str release];
}

-(void)printString
{
    // Why the value for "str" getting printed here,
    // though its released in viewDidLoad?
    NSLog(@"string is %@",str);
}

【问题讨论】:

    标签: iphone ios ios4 nsstring


    【解决方案1】:
    1. 别看retainCount。它会让你感到困惑,而且没有帮助。

    2. 常量字符串直接内置在代码中——它们永远不会被分配或释放。您可以像处理任何其他对象一样保留和释放它们,但不要期望在任何时候释放常量字符串。

    【讨论】:

      【解决方案2】:

      在objective-c 中,init 方法不一定返回使用alloc 创建的相同对象。它可能会释放自我,然后返回另一个对象。

      initWithString 的情况下,它很有可能返回@"Hello" 常量字符串对象,而不是初始化一个新字符串,因为它更快并且没有负面影响(两个字符串都是不可变的)。

      正如@Caleb 所说,正常的内存管理规则不适用于常量字符串。你不能释放它,它会一直在那里。

      但所有这些都是无证行为,可能会发生变化。你不能依赖它,而且你发布的代码错误的,在发布了你不应该尝试访问它的东西之后。

      相反,您应该遵循标准做法,即您应该始终释放一个对象,并在完成后将指向它的任何指针设置为 nil。如果您在发布后将str 设置为nil,您将看到预期的行为。

      或者更好的是,只需打开 ARC,就可以忘记所有这些事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-03-21
        • 1970-01-01
        • 2012-01-22
        • 2012-05-28
        • 2017-12-01
        • 1970-01-01
        相关资源
        最近更新 更多