Iphone 如果我不';在分配新的已分配内存之前,是否将var设置为nil?

Iphone 如果我不';在分配新的已分配内存之前,是否将var设置为nil?,iphone,memory-management,memory-leaks,nsstring,Iphone,Memory Management,Memory Leaks,Nsstring,所以我有下面的课程。对于同一个数据实例,可以多次调用setName。现在的问题是,如果不做_name=nil;在为其分配新字符串(已分配内存)之前,是否会导致内存泄漏 // data.h @interface data : NSObject { @private NSString *_name; } @property (strong, nonatomic) NSString *name; // data.m @synthesize name = _name; - (void)se

所以我有下面的课程。对于同一个数据实例,可以多次调用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;
}
//data.h
@接口数据:NSObject
{
@私人的
NSString*\u名称;
}
@属性(强,非原子)NSString*名称;
//data.m
@合成名称=_名称;
-(void)setName:(NSString*)名称{

_name=nil;//代码中的属性名称有一个强修饰符,因此我假设您使用的是ARC。在这种情况下,不,它不会导致内存泄漏。

不,它不会导致内存泄漏。但是,如果您在使用var之前不初始化它,您将永远不知道现在正在使用哪个内存部分。也就是说,您希望它不会导致内存泄漏lds a
nil
但它可能指向内存中其他变量数据所在的随机位置。这样做可能会弄乱应用程序的数据。

在您的特定情况下,不会出现内存泄漏。这是因为@synthesis如何为您设置setter方法。在强属性属性的情况下,setter看起来像这样:

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

    _name = newName;
    return _name;
}

它基本上负责你的内存管理。首先,它保留了新名称,然后再发布它(如果名称和新名称相同,首先发布会使你的应用程序崩溃)。然后它释放旧名称并将新名称分配给您的_nameivar

注意:在现实世界中只需使用
copy
。我认为,在使用它之前,var将在运行时自动初始化为nil。这不是真的吗?@tom这是真的。当您创建实例时,ivar总是初始化为零。请尽量不要忽略它初始化它们,看看会发生什么。如果他没有使用ARC,就写@property(非原子,retain)还应该负责内存管理。@philsquared是的,但在这种情况下,他有一个自定义的setter,因此在分配新值之前必须释放name的旧值。他已经覆盖了自动setter,看起来如何无关紧要!重点是要说明强属性类型应该如何处理内存如果他要覆盖自动设置,他至少需要实现上述代码以防止泄漏。