黑马程序员技术交流社区

标题: .语法 如果成员变量有 age,_age,set,get方法具体 [打印本页]

作者: 秋天De神话    时间: 2014-4-3 22:48
标题: .语法 如果成员变量有 age,_age,set,get方法具体
.语法  如果成员变量有 age,_age,set,get方法具体是改变age,还是_age
作者: 程浩    时间: 2014-4-3 22:58
你以后注意了,苹果官方要求声明的成员变量最最最好加下划线   _  
其目的就是要区分成员变量局部变量的不同,注意使用点方法前必须得有setget方法
例如:
  1. - (void) setAge:(int)age
  2. {
  3.         _age = age;
  4.         NSLog(@"setAge");
  5.         //self.age=age;//会引发死循环  
  6. }
  7. - (int)age
  8. {
  9.         NSLog(@"age");
  10.         return _age;//或者return self->age;
  11.         //return self.age;//死循环
  12. }
复制代码




作者: cnchenys    时间: 2014-4-3 22:58
本帖最后由 cnchenys 于 2014-4-3 23:10 编辑

看你set和get的实现方法.

@interface Person : NSObject
{
    int age;
    int _age;
}
- (void)setAge:age;
- (int)age;
@end

@implementation Person
- (void)setAge:age
{
    self->age=age; //如果self值得是age 那么就是给age赋值  如果指的是_age那就是给_age赋值
}
- (int)age
{
    return age;   // _age毅然
}

@end
如果是用@property生成的,则是默认_age属性的set和get方法,手写的话,如上描述

点语法:如果是赋值的话,为set方法,例如:  p.age=10; ==  [p setAge:10];
若果是在取值,则为get方法,例如: NSLog(@"%d",p.age); == NSLog(@"%d",[p age]);
作者: 沙洲冷    时间: 2014-4-3 23:02
是_age,一般成员变量都命名为_age而不是age,所以尽量不要在你的成员变量中出现age。
作者: agelessman    时间: 2014-4-3 23:41
使用点语法代替传统的get方法和set方法

1 int main(int argc, const char * argv[])

2 {

3 @autoreleasepool {

4 Student *stu = [[Student alloc] init];

5

6 // 设置age的值

7 stu.age = 10; // 等价于[stu setAge:10];

8

9 // 取出age的值

10 int age = stu.age; // 等价于int age = [stu age];

11

12 NSLog(@"age is %i", age);

13

14 [stu release];

15 }

16 return 0;

17 }



死循环注意
-(void)setAge:(int)age{
       //下面代码会引发死循环
      self.age = age;
}
-(int)age{
       //下面代码会引发死循环
       return self.age;
}

这个就说的很详细了 ,主要跟你自己写的代码有关,不过一般是-age
作者: 于清扬    时间: 2014-4-4 21:35
1、如果你的setter和getter是用@property来替代的,那么默认访问的是_age。
2、如果你写了synthesize:
1>比如synthesize age;那么他会改变age。
2>synthesize age = _age; 这样写的话他会改变_age。
3、如果你是手写的setter和getter,那就要看你的代码了。




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2