@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方法。 --------------------编程问答-------------------- 具体? --------------------编程问答-------------------- 嗯哼 ? --------------------编程问答-------------------- @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