【问题标题】:Confusion in Understanding NSString and its memory management in ARC理解 NSString 及其在 ARC 中的内存管理的困惑
【发布时间】:2014-11-06 07:16:13
【问题描述】:

这可能是一个基本问题,但我仍然不清楚。

第一个实例:我将在头文件中声明一个字符串为弱字符串。

@property(weak)NSString *string1;

@synthesize string1;

然后在我的 viewDidLoad 方法中,我会给它分配一些虚拟文本...比如 string1=@"hello world";

- (void)viewDidLoad
{
    [super viewDidLoad];
    string1=[NSString stringWithFormat:@"hello world"];
}

然后在 viewDidAppear 方法中我将打印string1 的值

-(void)viewDidAppear:(BOOL)animated
{
     NSLog(@"%@",string1);
     //It gives me 'null'(remember string1 is of weak property )
}

第二个实例:对于相同的字符串1(弱),我将以不同的方式为其分配相同的文本。

- (void)viewDidLoad
{
    [super viewDidLoad];
    string1=@"hello world";
}

然后在 viewDidAppear 方法中我将打印string1 的值

-(void)viewDidAppear:(BOOL)animated
{
     NSLog(@"%@",string1);
     //It prints 'hello world'
}

这里出了什么问题?...是 ARC 问题还是缺乏基本知识...任何关于此的进一步解释将不胜感激。

【问题讨论】:

  • 这已经被问过了。基本上常量字符串与在运行时构造的NSString 实例有不同的内存要求。

标签: objective-c ios7 memory-management nsstring automatic-ref-counting


【解决方案1】:

让我们打印出这两个对象的地址以澄清发生了什么。

// $ clang a.m -fobjc-arc -framework Foundation -O0 -g
#include <Foundation/Foundation.h>
int main()
{
    NSString *str0 = [NSString stringWithFormat:@"str0"];
    NSString *str1 = @"str1";

    NSLog(@"str0 = %p", str0);
    NSLog(@"str1 = %p", str1);

    NSLog(@"\nsome heap address = %p", malloc(1));

    return 0;
}

结果如下(在 2013 年初的 MacBook Pro 上)

str0 = 0x7fcd02c02fd0
str1 = 0x10854b098

some heap address = 0x7fcd02f00350

“str0”的地址与堆地址足够接近。所以这个 NSString 对象存储在堆中。

[NSString stringWithFormat:@"str0"];

因此,这个 NSString 对象由 ARC 管理。

但是'str1'的地址似乎离堆地址太远了。它可能存储在 .data 部分或 .rodata 部分或某种区域中。因为 '@"str1"' 是常量 NSString 文字。永远不会从内存中释放出来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-12
    • 2016-09-12
    • 1970-01-01
    • 1970-01-01
    • 2012-03-04
    • 2011-11-14
    • 2013-01-17
    • 1970-01-01
    相关资源
    最近更新 更多