【问题标题】:NSString reassign value causing memory leak?NSString重新分配值导致内存泄漏?
【发布时间】:2012-09-14 03:23:24
【问题描述】:

据我所知,NSString 是“创建一次且只读”的类型。当给 NSString 重新赋值时,我们实际上改变了指针的值,使它指向另一个内存地址,但是 NSString 对象保持不变。

我的问题是:如果 NSString 对象没有其他指针指向它,是否会在重新分配后导致内存泄漏?

详细讨论请阅读以下代码:

@interface ViewController ()
@property (nonatomic,strong) NSString* aString;
@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    self.aString = [NSString stringWithFormat:@"Hello %@",@"Philip"];

    // only for setting a break point
    int x;

    // reassigning 
    self.aString = [NSString stringWithFormat:@"Goodbye"];

    // only for setting another break point
    int y;
}

@end

在调试控制台中:

(lldb) po self.aString
(NSString *) $0 = 0x00337d00 Hello Philip
(lldb) po self.aString
(NSString *) $1 = 0x3f41dfe0 Goodbye
(lldb) 

它清楚地表明,在重新分配值之后,aString 现在指向不同的内存位置。我的另一个问题是:如何在调试控制台中显示以0x00337d00 开头的对象?

【问题讨论】:

  • po 0x00337d00 将在该位置打印对象。如果对象被解除分配,可能会崩溃;-) 请注意,某些对象可能不会立即解除分配,而是在清理自动释放池时。在尝试了解保留/释放的工作原理时,您可能会发现 NSZombieEnabled 很有用:)

标签: objective-c nsstring


【解决方案1】:

如果 NSString 没有指向它的指针,它应该被释放。这可能只有在自动释放池被耗尽后才会发生,因为它是使用一个应该返回自动释放的方法创建的。

@"string" 这样的字面 NSString 也永远不会被释放,因为它们实际上是常量(有点像单例)。

【讨论】:

    【解决方案2】:

    因为如此强大是 ARC 中保留属性的替代品。使用分配和检查

    @property (nonatomic,assign) NSString* aString;
    

    【讨论】:

    • 它也改变了内存位置,同样是 weak。奇怪
    猜你喜欢
    • 2011-02-18
    • 1970-01-01
    • 2019-08-12
    • 2012-08-10
    • 2012-08-10
    • 2010-10-25
    • 2021-09-21
    • 2021-05-01
    • 1970-01-01
    相关资源
    最近更新 更多