1

这是2个代码快照-

@interface A:NSObject
{
     NSMutableArray *a;
}

@property (retain)   NSMutableArray *a;


@implementation

@synthesize a;

-(id)init
{
      if(self=[super init])
     {
            a=[[NSMutableArray alloc] init];
     }
}

@end


@interface A:NSObject
{
     NSMutableArray *_a;

}

@property (retain)   NSMutableArray *a;



@implementation

@synthesize  a=_a;

-(id)init
{
      if(self=[super init])
     {
            _a=[[NSMutableArray alloc] init];
     }
}

@end

现在我需要知道的是,在两个代码实例变量中直接赋值而不是使用访问器并且保留计数为 1?或者他们之间有区别。谢谢。

还有一件事,Apple 建议不要在 init/dealloc 中使用 accessor,但同时要求不要直接设置 iVar。那么在 init() 中分配 ivar 值的最佳方法是什么?

4

2 回答 2

1

ARC 与非 ARC

首先,您应该决定是要使用自动引用计数 (ARC) 还是手动引用计数。看起来您选择了后者 - 这很好,因为您以后总是可以过渡到 ARC。

属性属性/setter 语义

您已将属性的 setter 语义标记aretain。这将起作用;但由于该属性暴露在类接口中,类用户可以使用它来设置_aivar。由于类用户可能不希望您的类A直接修改NSMutableArray他们传递的实例,因此最好copy对可变对象属性使用语义。

财产访问initdealloc

init通常不鼓励在and中使用声明的属性,dealloc因为这样做可能会因 KVO 而产生副作用。这些副作用可能不适用于部分构造或部分解构的对象。

你的问题

这是我要做的:

// assumes Xcode 4.4+ for autosynthesize
@interface A:NSObject
@property (nonatomic,copy) NSMutableArray *a;
@end

@implementation A

- (id)init {
    self = [super init];
    if( !self ) return nil;

    _a = [[NSMutableArray alloc] init];

    return self;
}
@end

编辑:

或者,如果自动合成不可用:

@interface A:NSObject
@property (nonatomic,copy) NSMutableArray *a;
@end

@implementation A

@synthesize a = _a;

- (id)init {
    self = [super init];
    if( !self ) return nil;

    _a = [[NSMutableArray alloc] init];

    return self;
}
@end
于 2012-09-19T10:31:46.177 回答
0

您提到的上述两个代码没有区别。在最新的编译器中,您现在不需要使用属性指定实例变量。所以上面的代码现在将是:

@interface A:NSObject
@property (strong) NSMutableArray *a;
@end

@implementation
-(id)init
{
    if (self = [super init])
    {
       _a = [[NSMutableArray alloc] init];
    }
    return self;
}

@end

在这种情况下,属性“a”具有自动合成功能,_a 是实例变量。基本上,以属性名称为前缀的 _ 是实例变量名称。

如果在 ARC 中,则不会发布。使用 self.a 访问其他任何地方。

您说得对,Apple 建议不要在初始化程序和 dealloc 中使用属性,因为它们没有被初始化。

并回答您的问题:“与属性一起使用时,不同的 iVar 名称是否更改保留计数”是使用属性时,您不应该担心这一点。它可能在短时间内具有不同的保留计数,但对您或代码而言应该无关紧要。

希望能帮助到你。

于 2012-09-19T10:23:41.647 回答