在学Your Second iOS App 时候,代码里有地方用到 
- (void)setSighting:(BirdSighting *) newSighting
{
    if (_sighting != newSighting) {
        _sighting = newSighting;
        
        // Update the view.
        [self configureView];
    }
}
自己试着把_sighting换成self.sighting 就报错了。。
不知道这两种调用方法是什么区别,网上也看了好多,都感觉不是很明白,谢谢您了

解决方案 »

  1.   

    self.sighting编译器会自动调用该属性对应的get /set方法。
      

  2.   

    @synthesize hello = _hello就是定义了一个setget方法,其中传入的参数是hello,所修改的类属性名字叫做_hello,你也可以学成其他的名字,但是一般都是用下划线加原名称。用self.hello不能显示是因为.运算符和java里面的不一样,在java里面就是直接调用一个属性了例如this.username,但是在OC里面,.运算符是不一样的,这里是用来调用set和get方法。self.hello的真是面孔是[self getHello]或者[self setHello],具体是set或者get要看你怎么使用self.hello,和java不一样,
      

  3.   

    "self.xxx = “ 就等于 [self setxxx:] 你在set里调用set方法自然就会变成循环调用了。
      

  4.   

    属性定义了数据的getter(获取时调用)setter(赋值时调用)。如果自己未定义setter方法,编译器会自动生成setter方法。self.XXX=.....
    在程序运行到此语句时,会调用类中相应的setter方法,但如果你自己也实现了setter方法,那么系统在编译时就不再为你自动生成setter方法,而是使用你自己指定的setter方法。你上面的代码中已声明了自己的setter方法,在使用这个属性时会被调用。说到这里你应该也明白你上述的_sighting 为什么不能用self.signting来替换。如果替换了当在执行这个语句时,你想过会发生什么?
    if (self.sighting != newSighting) {
            self.sighting = newSighting;
             
            // Update the view.
            [self configureView];
        }当程序运行到self.sighting时又会调用类的setSighting方法。程序会陷入死循环。
      

  5.   

    主要是因为在set/get方法使用本身变量时,有名字可用又可以表达本身变量的意思。在Xcode 5.0中这是自动的,因为不允许重名
      

  6.   

    _sighting是get和set的私有属性 那个方法只是显示的声明了set的方法 在需要执行赋值的时候进入到当前方法体