在-init中直接设置属性的ivar时是否保留了对象?

时间:2014-04-16 19:30:50

标签: objective-c memory-management instance-variables declared-property

我的理解是应该直接从init方法内部访问实例变量。例如:

@interface ABC : NSObject

     @property (strong, nonatomic) NSString *name;

@end

@implementation ABC

- (id)init
{
    if ((self = [super init]) != nil)
    {
        _name = @"some name";
    }
}

// another init example

- (id)initWithName:(NSString*)n
{
    if ((self = [super init]) != nil)
    {
         _name = n;
    }
}

@end

我想知道_name变量。在init个示例中,_name是否已保留?对于这个例子,我使用的是ARC。

1 个答案:

答案 0 :(得分:1)

此代码中是否保留_name取决于您是否启用了ARC。如果您这样做,ARC将为您保留该对象(因为这是ARC的工作)。如果你没有打开ARC,你需要自己保留它,如下所示:

- (id)initWithName:(NSString*)n
{
    if ((self = [super init]) != nil)
    {
         _name = [n retain];
    }
}

(同样值得指出的是,NSStrings通常应该被复制而不是保留,因此您可以创建属性@property (copy, nonatomic) NSString *name;,并且赋值将是_name = [n copy]。)