当前位置:编程学习 > wap >>

@synthesize hello = _hello; 还不很理解。

在学Your Second iOS App 时候,代码里有地方用到 
- (void)setSighting:(BirdSighting *) newSighting
{
    if (_sighting != newSighting) {
        _sighting = newSighting;
        
        // Update the view.
        [self configureView];
    }
}


自己试着把_sighting换成self.sighting 就报错了。。
不知道这两种调用方法是什么区别,网上也看了好多,都感觉不是很明白,谢谢您了 --------------------编程问答-------------------- self.sighting编译器会自动调用该属性对应的get /set方法。 --------------------编程问答--------------------
引用 1 楼 SomnusLee1988 的回复:
self.sighting编译器会自动调用该属性对应的get /set方法。
  具体? --------------------编程问答-------------------- 嗯哼             ? --------------------编程问答-------------------- @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不一样, --------------------编程问答-------------------- "self.xxx = “ 就等于 [self setxxx:] 你在set里调用set方法自然就会变成循环调用了。 --------------------编程问答-------------------- 属性定义了数据的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方法。程序会陷入死循环。 --------------------编程问答-------------------- 主要是因为在set/get方法使用本身变量时,有名字可用又可以表达本身变量的意思。在Xcode 5.0中这是自动的,因为不允许重名 --------------------编程问答-------------------- _sighting是get和set的私有属性 那个方法只是显示的声明了set的方法 在需要执行赋值的时候进入到当前方法体 
补充:移动开发 ,  iPhone
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,