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