object.variable和object->变量之间的区别

时间:2011-03-12 09:26:22

标签: iphone objective-c

使用object.variableobject->variable有什么区别?我什么时候应该使用object->variable

4 个答案:

答案 0 :(得分:3)

当使用' - >'时,目标C是C的超集语法(类似于(* obj).var)你正在访问像C结构中的实例变量(ivar)(好吧,ObjC中的类只是花哨的C结构)。

因此使用'。'意味着您正在访问该物业。属性是Objective C 2.0中添加的功能,允许您通过setter / getter方法访问您的ivars,这些方法可以自动创建(使用@synthesize),也可以提供自己的实现。顺便说一句,财产绝对没有必要有相应的ivar。例如在@interface中你声明:

@interface Ololo : NSObject {
//NOTE: there is no ivar named someText or _someText or whatever you want
}

@property(nonatomic) NSString* someText;
@end

然后在@implementation中:

@implementation Ololo
@dynamic someText; //we're using this to tell compiler that we will provide getters/setters ourselves and it doesn't need to generate them (though it is not necessary to do that)

-(NSString*) someText {
    return [NSString stringWithContentsOfFile: @"some_file_path"]; //we actually get value from file
}

-(void) setSomeText:(NSString*) str {
   [@"asdas" writeToFile: @"some_file_path" atomically: YES];
}

@end

实际上你可以在这些方法中做任何你想做的事情。所以使用'。'只是[obj setSomeText: @"hello"]的快捷方式。

答案 1 :(得分:2)

如果你使用。您正在访问使用@property定义并使用@synthesize创建的类的属性。如果你使用 - >你只是访问一个实例变量,但它不是你应该经常使用的东西。而且使用非常有限。所以不要让自己变得困难并使用属性。

答案 2 :(得分:2)

间接运算符( - >)继承自C,可以用作访问结构中具有指针的字段的简写。

作为一个例子......

typedef struct IPhone {
    int serialId;
} IPhone;

这里我有一个传统的C结构,我可以实例化如下......

IPhone *phone = (IPhone*)malloc(sizeof(IPhone));

现在要访问它的字段,我可以做很长的事情......

*(phone).serialId = 1123432324;

或者我可以使用速记间接运算符...

phone->serialiId = 1123432324;

每个ObjectiveC类的核心都是一个C结构。因此,当您使用间接运算符时,您正在执行的操作是跳回到旧的C语法以后端到底层表示中。它有效,但它不是规定的ObjectiveC方式。

答案 3 :(得分:2)

object->变量是对变量的直接访问。 object.variable 是对getter访问器方法' - (id)变量'或setter访问器方法'的方法调用 - (void)setVariable:(id)值'取决于上下文。您必须自己编写访问器方法或使用@synthesize生成它们以使用点语法。

良好的编程习惯要求您始终使用访问器方法从另一个实例访问实例变量。即,不要使用 - >