【问题标题】:Allocation and release problem分配和释放问题
【发布时间】:2011-09-12 11:07:53
【问题描述】:

我正试图向一位朋友解释 iOS 上的内存管理,但我向他展示了一个错误的代码。但是当我启动该应用程序时,它正在工作,我不知道为什么。 这是sn-p:

NSString *myString = [[NSString alloc] initWithString:@"myString"];
[myString release];
NSLog(@"%@",myString);

我不明白为什么我的 NSLog 工作... 你有什么解释吗?

谢谢!

【问题讨论】:

  • 不这么认为。当您使用 init 关键字时,您直接拥有该对象。如果你想要一个自动释放,你必须写:stringWithString:
  • 从概念上讲,你是对的。在内部,这不是我在该问题的已接受答案的 cmets 中解释的那样。
  • 哦,抱歉,我没有看到它是一个链接 :) 谢谢!
  • 想一想,您的问题与其他问题相关,而不是完全重复。很抱歉投票结束。

标签: objective-c nsstring


【解决方案1】:

关于您的示例,有两点需要牢记。

  1. 正如 MByD 所解释的,访问已被释放的对象是未定义的行为。它可能会也可能不会使您的程序崩溃——这取决于分配给该对象的内存是否已被重用以及放在那里的内容。在某些情况下,内存还没有被重用(你可能认为该对象还活着,但该对象实际上是一个 ghost 对象),在其他情况下,内存可能已被另一个重用Objective-C 对象(程序不会崩溃,但你会看到不同的对象),在其他情况下,内存可能已被非 Objective-C 对象的东西重用(在这种情况下,程序可能会 - 但不是必然——崩溃)。

  2. 您的字符串对象是一个常量字符串。正如this question 及其 cmets 的答案中所解释的,永远不会释放常量字符串。当您发送-[NSString initWithString:] 传递一个常量字符串作为参数时,Cocoa 返回原始常量字符串,因此您的代码实际上与NSString *myString = @"myString"; 相同。这是一个内部 Cocoa 实现细节。生产代码应该始终考虑+alloc(通常是后续的-init)返回的对象归调用者所有,当调用者不再对它们感兴趣时应该释放它们,并且在释放后将不可用。

为了实验,试试下面的代码:

#import <Foundation/Foundation.h>
#include <stdio.h>

int main(void) {
    [NSAutoreleasePool new];

    NSString *s1 = [[NSString alloc] initWithString:@"myString"];
    NSString *s2 = [[NSString alloc] initWithString:@"myString"];
    NSString *s3 = [[NSString alloc] initWithString:@"myString"];
    NSString *s4 = [[NSString alloc] initWithString:@"myString"];

    printf("s1 = %p\n", s1);
    printf("s2 = %p\n", s2);
    printf("s3 = %p\n", s3);
    printf("s4 = %p\n", s4);

    [s1 release];
    [s2 release];
    [s3 release];
    [s4 release];

    return 0;
}

从概念上讲,s1s2s3s4 应该是不同的对象。但是,通过运行这个程序,您可以看到它们实际上是同一个对象(它们具有相同的地址):

$ ./a.out
s1 = 0x10080b090
s2 = 0x10080b090
s3 = 0x10080b090
s4 = 0x10080b090

【讨论】:

    【解决方案2】:

    这是一种未定义的行为。您无权访问此字符串,但它可能可用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-18
      • 2021-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多