【发布时间】:2013-05-22 13:53:15
【问题描述】:
您好,我正在处理内存泄漏,但我无法弄清楚它是什么问题(我对仪器没有太多经验,所以如果我问的问题很明显,请见谅)。
基本上,我的类中有两个字符串作为属性,将显示给用户的第一个在主队列中检索,而不需要立即在后台队列中检索的字符串:
@property (nonatomic, strong) NSString *stringDefaultLocationAddress;
@property (nonatomic, strong) NSString *stringCurrentLocationAddress;
-(void)viewDidLoad{
...
dispatch_async(idQueue, ^(void) {
[self recuperaDireccionActualEnBackground:currentUserLocation.coordinate];
});
}
- (void)dealloc{
[self removeObserver:self forKeyPath:@"playerProfileNeedsUpdate"];
self.stringCurrentLocationAddress = nil;
self.stringDefaultLocationAddress = nil;
}
问题与 stringWithFormat 中的占位符 @" %@..." 有关,因为如果我只是将 @"Test" 放在那一点,泄漏就消失了,但我不知道为什么会泄漏这个和我想了解一下。
提前致谢。
【问题讨论】:
-
如果您只输入
@"Test",您将创建一个不会泄漏的编译时间常数。当消息-[NSString copy]是可变的(NSMutableString的子类)或不可变时(NSString的子类)时,它会生成一个副本。因此,在声明NSString时始终复制。复制可变字符串可确保客户端不会远程更改您保存在属性上的值。如果您使用的是 iOS 5,您在CLGeocoder中有地理编码和反向地理编码,则不需要库。dealloc中的变量不需要置零,ARC 已经发布了属性。 -
感谢@Jano 的回复,我刚刚在该行添加了 COPY 消息,现在我没有内存泄漏,感谢您的友好回复。
-
我的意思是声明:@property (nonatomic, COPY) NSString *stringDefaultLocationAddress;