0

据我所知, 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在调试控制台中开始的对象?

4

2 回答 2

0

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

@property (nonatomic,assign) NSString* aString;
于 2012-09-14T03:37:29.117 回答
0

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

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

于 2012-09-14T03:59:38.487 回答