ios - OC懒加载中,两种写法的区别是?
巴扎黑
巴扎黑 2017-04-18 09:03:59
[iOS讨论组]

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

- (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;

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

巴扎黑
巴扎黑

全部回复(3)
巴扎黑

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

怪我咯

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

来学 swift 吧

lazy var dataArr: [AnyObject]()

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

迷茫

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

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

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

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

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号