OC: self. 与 _

老师的


@interface ViewController ()

//数据源数组
@property (nonatomic, strong)NSMutableArray *dataArray;

@end

@implementation ViewController

//一般使用懒加载来获取数据源
//在OC里面一般是重新实现getter方法
- (NSMutableArray *)dataArray {
    
    //if (self.dataArray == nil)写法是错误的
    if (_dataArray == nil) {
        
        //self.dataArray = [NSMutableArray array];写法是正确的
        _dataArray = [NSMutableArray array];
        //读文件
        NSString *path = [[NSBundle mainBundle] pathForResource:@"news" ofType:@"plist"];
        NSArray *array = [NSArray arrayWithContentsOfFile:path];
        for (NSDictionary *dict in array) {
            //创建对象
            News *model = [[News alloc] init];
            [model setValuesForKeysWithDictionary:dict];
            //[self.dataArray addObject:model];写法正确,因为有值了之后不再走if语句
            [_dataArray addObject:model];
        }
        
//        for (News *n in _dataArray) {
//            NSLog(@"%@", n.title);
//        }
        
    }
    
    //return self.dataArray;写法是错误的
    return _dataArray;
    
}








#pragma mark - UITableView代理
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    /**
     self.dataArray和_dataArray
     区别:
        self.dataArray会调用getter方法
     
     两个在大部分情况下是等价的,有时候需要区分
     */
    
    //return _dataArray.count;写法是错误的
    return self.dataArray.count;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    
    //1.重用标志
    static NSString *cellId = @"cellId";
    
    //2.获取可重用的cell
    NewsCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];
    //3.获取不到,创建新的cell
    if (nil == cell) {
        cell = [[NewsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
    }
    
    //4.显示数据
    //News *model = _dataArray[indexPath.row];写法是正确的,因为数组已经初始化了
    News *model = self.dataArray[indexPath.row];
    cell.model = model;
    
    return cell;
}


===========================================================================

我的


@property (nonatomic, strong) NSMutableArray *dataArray;

@end
@implementation ViewController

- (NSMutableArray *) dataArray {
    
//    if (self.dataArray == nil ){
    //错误的, 死循环, get 方法,自己调自己
    if (_dataArray == nil ){
        //set方法
        _dataArray = [NSMutableArray array];
//         _dataArray = [NSMutableArray array];
//        没区别,调用 set 方法。
        NSString *path = [[NSBundle mainBundle] pathForResource:@"news" ofType:@"plist" ];
        NSArray *array = [NSArray arrayWithContentsOfFile:path];        
        
        for (NSDictionary *dict in array){
            News *model = [[News alloc] init];            
            [model setValuesForKeysWithDictionary:dict];            
            
            [_dataArray addObject: model];
//            [self.dataArray addObject: model];
            //get 方法, 对的, if判定 ,不走了           
        
        }
        
        
    }
    
    
//    return _dataArray;
    return self.dataArray;
    // 调用 set 方法,错的。虽然不走 if ,但走``````
    
}



- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section{
    return self.dataArray.count;// 会调用 get 方法

//    return _dataArray;        是不可以的, 不会 调用 get方法。
    
}



- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath{

    static NSString *cellId = @"cellId";
    NewsCell *cell = [tableView dequeueReusableCellWithIdentifier:cellId];   
    
    if (nil == cell ){
        cell = [[NewsCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:cellId];
    }

    
    News *model = self.dataArray[indexPath.row];    
    cell.model = model;   
    return cell;

}



你可能感兴趣的:(OC: self. 与 _)