美文网首页
理解 OC 中实例变量(Instance variables)和

理解 OC 中实例变量(Instance variables)和

作者: 赵邦华 | 来源:发表于2020-10-27 23:04 被阅读0次

    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)和

          本文链接:https://www.haomeiwen.com/subject/iwmfvktx.html