0

所以我有以下课程。对于同一个数据实例,可以多次调用 setName。现在的问题是,如果不这样做 _name = nil; 在为其分配一个新字符串(分配的内存)之前,它会导致内存泄漏吗?

// data.h
@interface data : NSObject
{
@private
    NSString *_name;
}

@property (strong, nonatomic) NSString *name;

// data.m
@synthesize name = _name;

- (void)setName:(NSString *)name {
    _name = nil; // <-- if don't do this, would it end up causing memory leak?
    _name = [NSString alloc] initWithString:name;
}
4

3 回答 3

1

代码中的属性名称具有强修饰符,因此我假设您使用的是 ARC。在那种情况下,不,它不会导致内存泄漏。

于 2012-04-12T19:28:49.420 回答
0

在您的特定情况下,您不会出现内存泄漏。这是因为 @synthesize 如何为您设置 setter 方法。在强属性的情况下,您的 setter 如下所示:

- (void)setName:(NSString *)newName {
    [newName retain];
    [_name release];

    _name = newName;
    return _name;
}

它基本上为您处理内存管理。首先它保留 newName,然后再释放它(如果 name 和 newName 相同,首先释放会使您的应用程序崩溃)。然后它释放旧名称并将 newName 分配给您的 _name ivar

于 2012-04-12T20:10:05.237 回答
-1

不,它不会导致内存泄漏。但是,如果您在使用 var 之前没有对其进行初始化,您将永远不会知道现在正在使用哪个内存部分。即你想认为它持有一个nil但也许它指向内存中其他变量数据所在的随机位置。这样做可能会弄乱应用程序的数据。

于 2012-04-12T19:30:03.417 回答