2012-09-19 82 views
1

这里使用时不同的伊娃更名保留计数2码snapshot-是否与财产

@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?或者它们之间有区别。谢谢。

还有一件事,苹果建议不要在init/dealloc中使用存取器,但同时要求不要直接设置iVar。那么在init()中赋予ivar值的最好方法是什么?

+0

是什么这...那我甚至没有实际的Objective-C代码。 – TheAmateurProgrammer

+0

你应该修复你的代码。它格式不正确。你也可以询问两个不同的代码摘录之间的区别,但你只发布了一个。 –

回答

1

ARC与非ARC

首先,你应该决定是否要使用自动引用计数(ARC)或手动引用计数。看起来你已经选择了后者 - 这很好,因为你以后可以随时转换到ARC。

物业属性/ setter方法语义

您已经标记为属性aretain二传手语义。这将起作用;但由于该属性暴露在类接口中,所以类用户可以使用它来设置伊瓦尔_a。因为班级用户可能不希望您的班级A直接修改他们通过的实例NSMutableArray,所以最好使用copy语义来表示可变对象特性。在init

财产准入和initdeallocdealloc

使用声明的属性往往是气馁,因为这样做可能有副作用,由于志愿。这些副作用可能不适用于部分构建或部分解构的对象。

您的问题

这里是我会做:

// 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 
+0

嗨艾伦,谢谢你的回应。但是,如果我们在非ARC环境中使用Xcode 4.0,代码会怎样? – russell

+0

当然,请参阅编辑。 – FluffulousChimp

+0

“Apple建议不要在初始化器和dealloc中使用属性” - 这意味着我们应该使用_a而不是self.a ?? – russell

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建议不要在intializers和dealloc中使用属性,因为它们没有初始化。

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

希望它有帮助。