【发布时间】:2014-01-10 07:21:23
【问题描述】:
前两天开始学习objective-c的开发者,不太明白以下两种方法的区别:
1.
@interface Person : NSObject
@property NSString *firstName;
@property NSString *lastName;
@end
2.
@interface Person : NSObject{
NSString *firstName;
NSString *lastName;
}
@end
使用Java-Language,我们定义了两个字符串字段:
class Person extends Object{
(public/private/protected) String firstName;
(public/private/protected) String lastName;
}
我想知道哪个(1到2之间)和上面的Java代码意思一样。
非常感谢@iamyogish @Popeye,如果我的回答是正确的,我会纠正你们俩。 阅读电子书:Objective-C 2.0 Essentials 后,我了解到(如果不对,请告诉我。):
@interface Person : NSObject
@property NSString *firstName;
@property NSString *lastName;
@end
这相当于Java代码:
class Person extends Object{
private String firstName;
private String lastName;//In fact:private should be protected
//setter and getter.
//you can use ecplise tool to generate setter/getter method automaticly
}
正如您可能想象的那样,必须为大量(1000 或更多)复杂类编写这些方法最终会被证明是耗时的。 Objective-C 提供了合成访问器方法,所以你应该使用@property 和@synthesize 指令。如果你这样编写代码:
@interface Person : NSObject
NSString *firstName;//note that the default access level is protected.
NSString *lastName;
@end
不幸的是,你需要提供可以访问实例变量的方法,例如(你可以自己定义函数的名称)
-(NSString ) getFirstName;
-(NSString ) getLastName;
-(void) setFirstName:(NSString * name);
-(void) setLastName:(NSString * name);
除此之外,如果使用@property 和@synthesize 指令,您可以访问实例变量,如C++/JAVA 语法点符号,例如:
NSString * firstName= [[Person alloc] init].firstName;
请注意:理解点表示法的一个关键点是它仅适用于已声明合成访问器方法的实例变量。
实例变量的访问级别在类声明的@interface 部分中使用@protected、@private 和@public 指令指定。
@interface Person : NSObject
@public
NSString *firstName;//note that the default access level is protected.
NSString *lastName;
@end
当从另一个类或方法或函数中的任何其他代码访问公共实例变量时,使用 -> 指针运算符表示法。因此,您可以访问 C++/C 中的 Public Filed,如下所示:
[[Person alloc] init]->firstName = "your first name";
另一个问题是:
@interface Person : NSObject
@property NSString *firstName;
@property NSString *lastName;
@end
是等价于:
@interface Person : NSObject{
NSString *firstName;
NSString *lastName;
}
@property NSString *firstName;
@property NSString *lastName;
@end
还是没有?而ivar是否等价于实例变量?
【问题讨论】:
-
前两天开始学习Objective-C。
-
看看这个 SO 问题link
-
我看过,但我什至不明白。
-
您不再需要使用数字 2。它已经过时了。
-
天哪! Objective-C的setter和getter机制与C#类似
标签: objective-c cocoa