首页 > OC懒加载中,两种写法的区别是?

OC懒加载中,两种写法的区别是?

视频教程中,一段懒加载的写法:

- (NSArray *)dataArray{
    if (_dataArray == nil){
        NSString *path = [[NSBundle mainBundle] pathForResource:@"friends.plist" ofType:nil];
        NSArray *array = [NSArray arrayWithContentsOfFile:path];
        NSMutableArray *muArrray = [NSMutableArray arrayWithContentsOfFile:array];
        for(NSDictionary *dict in array){
            JQGroupModel *groupModel = [JQGroupModel groupWithDict:dict];
            [muArrray addObject:groupModel];
        }
        self.dataArray = [muArray copy];
    }   
    return self.dataArray;
}

如果结尾写成:

        _dataArray = muArray;
    }
    return _dataArray;
}

是否可以?
上面的写法属于深拷贝,更加安全吗?而且

    return self.dataArray;

不是自己无限用点语法调用自己了吗?


我咋感觉上面的有问题啊
一般都是 _ 吧
然后非空判断现在都是 if !dataArr 就好了

来学 swift 吧

lazy var dataArr: [AnyObject]()

这就是懒加载一个可变数组。。。


一般是写成 _dataArray = [muArray copy] ,赋值NSArray,而不是 NSMutableArray,而用 self. 的话是考虑到如果有 setter 方法;至于最后 return self.dataArray 应该 return _dataArray。


為什麼要 copy 是因為如果不 copy 而直接返回的話, 返回的是一個 NSMutableArray, 這樣一來,拿到這個返回值的地方如果調用一些更改 array 的操作(比如增刪元素)不會有任何異常, 當然大部分時候可能這也沒什麼, 但是這樣不嚴謹,有 bug 的時候就會很難調,所以一個 NSArray 的屬性還是讓它返回一個 NSArray,而不是一個 NSMutableArray。

set 的時候 用 self. 如上面 @foxling 所說,改屬性有可能有自定義的 setter,這樣也是更嚴謹的。

最後返回的地方,應該是 _dataArray 而不應該是 self.dataArray,其實 self.dataArray 就是去調用該屬性的 get 方法,在一個屬性的 get 方法里調用 該屬性的 get 方法,這樣一直循環,會導致棧溢出的吧?我沒有試過, 你可以寫個示例試試看,但是即便沒有問題,嚴謹起見,也是返回 _dataArray 好一點。

最後,十分同意 @loveuqian 所說的內容:來學 swift 吧!

【热门文章】
【热门文章】