#import "fjcViewController.h"@interface fjcViewController ()
@property (weak, nonatomic) IBOutlet UIButton *iconButton;
@property (nonatomic,strong) UIButton *cover;
//
@end
@implementation fjcViewController
// 懒加载
- (UIButton *)cover
{
    if (_cover == nil ) { // ***(1)这里为什么不能能用self.cover
        _cover = [[UIButton alloc] initWithFrame:self.view.bounds];
        self.cover.backgroundColor = [UIColor colorWithWhite:0.0 alpha:0.5];
        [self.view addSubview:_cover];
        self.cover.alpha = 0.0;
        [self.cover addTarget:self action:@selector(smallImage:) forControlEvents:UIControlEventTouchUpInside];
    }
    return  _cover;// ***(2)这里为什么不能能用self.cover
}请教:1 请问什么在红色的那两行里面只能用 _cover  ,而不能用self.cover.
           2 请问在绿色的地方为什么用_cover 和self.cover.都行啊,,,
求问这两点语法和self语法在这里的细节区别。self是调用了自动生成的get语法,_cover是声明的时候就自动生成的。不过这有什么区别啊?

解决方案 »

  1.   

    _cover是直接值访问,而self.cover是属性访问,就是通过get/set方法来读取这个值,xcode会默认将两个值通过syncthesize关键字进行同步- (UIButton *)cover这个方法就是self.cover的get方法,也就是说每次你调用self.cover的时候都会进入这个方法,那么问题来了
    如果你在这个方法里用了下面这个语句
    if (self.cover == nil );逻辑上就行不通,因为你在这里调用self.cover他会再一次进入这个方法,理论上就会死循环
    而_cover是直接值访问的,他不会调用get/set方法,所以就不会有这个问题.至于绿色的地方为什么可以就很好理解了吧,虽然他也会进入get方法,但是他已经不等于nil了.会直接返回他本身,所以没有问题.
      

  2.   

    _cover是直接值访问,而self.cover是属性访问,就是通过get/set方法来读取这个值,xcode会默认将两个值通过syncthesize关键字进行同步- (UIButton *)cover这个方法就是self.cover的get方法,也就是说每次你调用self.cover的时候都会进入这个方法,那么问题来了
    如果你在这个方法里用了下面这个语句
    if (self.cover == nil );逻辑上就行不通,因为你在这里调用self.cover他会再一次进入这个方法,理论上就会死循环
    而_cover是直接值访问的,他不会调用get/set方法,所以就不会有这个问题.至于绿色的地方为什么可以就很好理解了吧,虽然他也会进入get方法,但是他已经不等于nil了.会直接返回他本身,所以没有问题.