OC中的实例变量(Instance variables):**
OC中的实例变量(Instance variables)正如其名,就是一个实例中的变量(也就是 Swift 中的属性),可以是公开的(pubilc),也可以是(private)的,其创建方式如下(注意,定义的时候放在@interface
后的花括号里):
@interface Person : NSObject
{
@public NSString *name;
}
@end
注意,实例变量创建后是没有getter
和setter
方法的,如果想要给实例变量赋值,需要用"->"符号:
Person *person = [[Person alloc] init];
person->name = @"Peter";
NSLog(@"%@", person->name); // Peter
OC中的属性(property) :
OC中的属性(property)区别我们理解的Swift中的属性,创建OC属性的时候,其实就是系统自动的在内部创建一个私有的实例变量+getter
+setter
。比如创建一个NSString
类型的属性name
,那OC会在幕后创建一个实例变量_name
、一个getter
方法- (NSString*)name
和一个setter
方法- (void)setName:(NSString *)newName
,具体如下:
@property NSString *name;
等价于
@synthesize name = _name;
- (NSString*)name {
NSLog(@"Reading name!");
return _name;
}
- (void)setName:(NSString *)newName {
NSLog(@"Writing name!");
_name = newName;
}
@synthesize
的作用就是把name
属性的实例变量命名为_name
。
创建属性的时候,系统默认是在属性前面加上下划线_的名称作为属性的实例变量,如果想要改变属性实例变量的名称,则用@synthesize
,比如上面的例子,我们将name
属性的实例变量改为personName
:
@synthesize name = personName;
系统给属性默认创建的getter
和setter
方法让读写属性变得很容易,比如可以用"." 符号读写属性了:
Person *person = [[Person alloc] init];
person.name = @"Peter";
NSLog(@"%@", person.name); // Peter
当然也可以用getter
和setter
方法
NSLog(@"%@", [person name]); // Peter
[person setName:@"Jack"];
NSLog(@"%@", [person name]); // Jack
总结
- OC中实例变量就是一个实例中的变量,类型Swift中的属性
- OC中的属性就是系统自动创建的一个私有的实例变量(名称是下划线+属性名)+
getter
+setter
还有一些规范需要注意:
- 假如有一个属性叫
name
,那要避免使用@synthesize name;
(把 name 属性的实例变量命名为 name),不然容易分不清属性和实例变量。 - 在m文件中,不建议直接使用属性的实例变量,但因为方便,很多时候这样用:
- (void) printName {
NSLog(@"%@", _name); // 因为方便,经常用
NSLog(@"%@", self.name); // 建议的用法
}
网友评论