对于属性访问,点语法或括号语法是否正确?

时间:2012-05-28 15:02:07

标签: objective-c syntax properties

假设我有

@interface A : NSObject
@property (nonatomic, strong) NSMutableArray *array;
@end

稍后在另一个类B中,我想访问该数组,以检查其中有多少项。我可以在B中执行以下两项操作之一(aA的实例):

选项1

[a.array count]

选项2

[[a array] count];

哪种选择是最好的方法?使用[a array]作为getter方法时,选项2是否是访问数组的正确方法?

3 个答案:

答案 0 :(得分:3)

如果你合成了数组,那么

都是一样的。在第一个中你只需要调用属性,在第二个中你调用由@synthesize动作生成的getter方法。

确保第二个选项是正确的,因为@synthesize有两个方法

1- getter与属性名称相同 2- setter,在开头添加属性名称,首字母为captial,如setArray。

答案 1 :(得分:1)

如果您已合成阵列,两者之间没有区别,正如萨阿德所说。但是,我建议使用括号语法在所有方法调用中保持一致,因为所有其他Objective-C方法(除了C中的函数)都使用括号语法来调用。

答案 2 :(得分:0)

在您决定重命名生成的getter / setter方法并且消息可能无效之前没有区别。

对于公共实例变量,您可以跳过访问器方法(属性和方法样式)并使用结构解除引用运算符:

@interface A : NSObject
{
   NSMutableArray *array;
}

@property (nonatomic, strong) NSMutableArray *array;
@end

classA.m

[self->array count];

classB.m

[a->array count];

执行此操作,您可以放弃使用具有不同属性的属性(在两种访问方式中)进行的操作和内存管理优化的便利性,请参阅more

作为NSString属性的示例

@property (readwrite, copy) NSString *sVar;

生成的setter看起来像这样:

-(void)setSVar:(NSString*)inSVar
{
        if (self->sVar != inSVar)
        {
                [self->sVar release];
                self->sVar = [inSVar copy];
        }
}
相关问题