理解 OC 中实例变量(Instance variables)和属性(property) 的区别

OC中的实例变量(Instance variables):**

OC中的实例变量(Instance variables)正如其名,就是一个实例中的变量(也就是 Swift 中的属性),可以是公开的(pubilc),也可以是(private)的,其创建方式如下(注意,定义的时候放在@interface后的花括号里):

@interface Person : NSObject
{
    @public NSString *name;
}

@end

注意,实例变量创建后是没有gettersetter方法的,如果想要给实例变量赋值,需要用"->"符号:

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;

系统给属性默认创建的gettersetter方法让读写属性变得很容易,比如可以用"." 符号读写属性了:

Person *person = [[Person alloc] init];
person.name = @"Peter";
NSLog(@"%@", person.name);  // Peter

当然也可以用gettersetter方法

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);  // 建议的用法
}

你可能感兴趣的:(理解 OC 中实例变量(Instance variables)和属性(property) 的区别)