Objective c NSString重新分配值导致内存泄漏?

Objective c NSString重新分配值导致内存泄漏?,objective-c,nsstring,Objective C,Nsstring,据我所知,NSString是“创建一次且只读”类型。将值重新指定给NSString时,实际上我们更改了指针的值,使其指向另一个内存地址,但NSString对象保持不变 我的问题是:如果NSString对象没有其他指针指向它,那么在重新分配后是否会导致内存泄漏 要详细讨论,请阅读以下代码: @interface ViewController () @property (nonatomic,strong) NSString* aString; @end @implementation ViewCo

据我所知,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
开始的对象?

因为这样强的属性替换了ARC中的retain属性。请使用assign和check

@property (nonatomic,assign) NSString* aString;

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


另外,像
@“string”
这样的文本NSstring永远不会被解除锁定,因为它们实际上是常量(有点像单例)。

它还改变了内存位置,同样是弱的。怪异的
po 0x00337d00
将在该位置打印对象。如果对象被解除锁定,则可能会崩溃;-)请注意,某些对象可能不会立即解除锁定,而是在清除自动释放池时解除锁定。您可能会发现NSZombieEnabled在试图理解保留/发布如何工作时非常有用:)