【问题标题】:NSString : leak when assigning value to a propertyNSString:为属性赋值时泄漏
【发布时间】:2016-09-23 02:34:45
【问题描述】:

假设我们不使用 ARC。 假设我们有一个非常简单的类,我们在其中声明了 2 个 NSString 属性,如下所示:

@interface Foo : UIView {}
-(id)initWithArguments:(NSString*)mess title:(NSString*)tit;

@property(nonatomic, retain) NSString *message;
@property(nonatomic, retain) NSString *title;
@end

并在实施中:

@implementation Foo
@synthesize message, title;

-(id)initWithArguments:(NSString*)mess title:(NSString*)tit{
if((self = [super init])){
message = mess; // (1)
self.title = tit; // (2)
(...)
}
return self;
}

-(void)dealloc{
message = nil;
title = nil;
[super dealloc];
}
@end

现在,如果我从另一个类调用一个方法,我在其中创建 2 个 NSString 和一个 Foo 实例,如下所示:

-(void)someMethod{
NSString *string1 = [NSString stringWithFormat:@"some text with %d things", 5];
NSString *string2 = [NSString stringWithFormat:@"other text with %d things", 5];

Foo *foo = [[Foo alloc] initWithArguments:string1 title:string2];
}

整个代码工作正常,不会崩溃,但是,如果我用仪器分析它,

  • 调用 (1)("message = mess;") 时不会导致泄漏
  • 调用 (2)("self.title = tit;") 时会导致泄漏

这很令人困惑,因为 stringWithFormat 是一个自动释放的对象,不是吗? 那么,自动释放的对象在分配给属性时如何导致泄漏???

我在某处读到,使用“self.text = value;”几乎总是更好。形式而不是“文本=值;”表格,因为第二个可能会导致泄漏。

实际上,在这段代码中恰恰相反。

而且...如果我使用像@“some text”这样的常量NSString,而不是[NSString stringWithFormat]返回的值,当然不会泄漏。

有什么想法吗?

【问题讨论】:

  • 那你为什么不使用self.message = mess;
  • 尽量避免在ARC中使用关键字retain,在这种特殊情况下它被编译为strong,但如果指定属性会更好' 明确的属性,例如在NSString 的情况下使用strongcopy。顺便说一句,谁告诉你这里有泄漏?
  • 正如我一开始所说的,我不使用ARC。使用仪器分析应用程序时会出现泄漏。
  • 你没有忘记在dealloc方法中release你的对象吗?而且您的initWithArguments:title: 方法实现是错误的。检查如何编写 init 方法
  • 是的,您正在初始化并且错误,不要解除分配。你真的应该使用 ARC,它只是省去了很多麻烦,而且没有缺点。

标签: ios objective-c memory-leaks properties nsstring


【解决方案1】:

在某些情况下,您忘记调用(编译器生成的)setter 方法:

self.message = mess;    // in init method

self.message = nil;     // in dealloc method
self.title = nil;       // ditto

在非 ARC 代码中使用 setter/getter 方法至关重要。

【讨论】:

  • 非常感谢 trajanfoe:这有时会让人很困惑如何在 obj-C 中正确使用属性,即使您已经编码多年。
猜你喜欢
  • 2011-03-17
  • 1970-01-01
  • 1970-01-01
  • 2011-10-31
  • 2011-02-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-22
相关资源
最近更新 更多