美文网首页
OC对象self.属性名与_属性名的调用区别

OC对象self.属性名与_属性名的调用区别

作者: clearBubble | 来源:发表于2017-05-02 12:32 被阅读0次

    前段时间写项目的时候遇到一点小Bug,搞了一会儿发现是一个比较基础的问题,决定要抽出时间记录一下以便区分。为了方便说明调用区别写了几段代码。这里就不用iOS项目了,因为觉得没有必要。

    从创建一个Person对象开始,以下分别是Person对象的.h声明和.m源文件。

    #import <Foundation/Foundation.h>
    
    @interface Person : NSObject
    
    @property (nonatomic, strong) NSMutableArray *arrayNames;
    
    - (void)run;
    
    @end
    

    Person对象中包含了一个NSMutableArray的成员属性,懒加载方法中只做了初始化可变数组的操作。另外还包含了对象run方法, run方法中两次对同一个数组进行了元素的添加并输出数组中的所有元素内容。区别在于一个是用self.arrayNames 添加元素,另一个是用_arrayNames添加元素。

    
    #import "Person.h"
    
    @implementation Person
    
    - (NSMutableArray *)arrayNames
    {
        if(_arrayNames == nil){
            _arrayNames = [NSMutableArray array];
        }
    
        return _arrayNames;
    }
    
    
    - (void)run{
        
        [_arrayNames addObjectsFromArray:@[@"Elise",@"Jinx",@"Vayne"]];
        NSLog(@"%@", _arrayNames);
        
        [self.arrayNames addObjectsFromArray:@[@"Elise",@"Jinx",@"Vayne"]];
        NSLog(@"%@", self.arrayNames);
     
    }
    
    @end```
    
    最后在main函数中调用并输出结果:
    ```objc
    #import <Foundation/Foundation.h>
    #import "Person.h"
    
    int main(int argc, const char * argv[]) {
        @autoreleasepool {
            // insert code here...
    
            [[[Person alloc] init] run];
            
        }
        return 0;
    }
    
    

    明显可以看到使用_arrayNames添加元素是不会执行懒加载的方法,也就意味着这时候的arrayNames没有被初始化所以就更不可能添加元素了。虽然并没有什么报错。但确实是使用了一个空指针调用了添加元素的方法。如果是在java中是会出现error的。

    运行结果

    总体来讲:
    使用 self.arrayNames 和 使用 _arrayNames调用方法,虽然都是调用对象本身的一些成员方法。但是_arrayNames是直接去访问该成员属性并去调用方法。而self.arrayNames 是先执行一遍懒加载方法再去调用成员方法。

    相关文章

      网友评论

          本文标题:OC对象self.属性名与_属性名的调用区别

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