视频教程中,一段懒加载的写法:
- (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 吧!