属性一般不加下划线
声明的属性对应setter方法中的形参,而不是实例变量,这一点一定要注意 注意:实现属性的时候,name=_name代表将形参和实例变量建立关系,而不是赋值 可以把相同类型的属性定义在一行,但是最好不要这么做,因为这样会降低程序的可读性,我们一般都是一个属性定义一次.
@synthesize name=_name; 可以省略,如果你定义了实例变量_name,那么Xcode会自动帮你去定义属性的实现@synthesize name=_name;即帮你去关联实例变量_name.
实例变量也可以省,如果你将属性的实现和实例变量都省掉了,系统会默认创建一个私有的(extersion)实例变量_name,如果你非常遵守苹果的命名规范的话,这无疑大大的简化了你的代码!但是,私有化的实例变量,在被子类继承的时候,是不可见的,即子类无法直接使用_name=@"aaaa",会报错,但是可以用setter,getter方法:[self setName:@"aaaaa"];
@synthesize name;如果你没有全部省掉,而只是把"=_name"这部分省略掉了,那么系统会给你创建一个私有的(extersion)实例变量name,注意是name,这样问题就来了,因为你的属性是name,而形参的优先级是最高的(越往里越高),所以会出错,变量名重复,无法得到我们想要的结果. @synthesize 实现的属性,可以用点语法,赋值和取值都可以,如:
p.name=@"aaaaaaaa"; //可以用点语法直接给属性赋值
NSLog(@"-------%@",p.name);//可以用点语法取属性值
属性也可以用getter和setter,如:
[p setName:@"bbbbbbb"]; //默认生成的set方法的方法名是setName
NSLog(@"-------%@",[p getName]);//注:用属性生成的get方法默认的方法名是name,不是“getName”。所以不能用getName调用,这里要注意。
如果没有用@property将成员变量定义为属性,而是自己定义get(访问器),set(设置器)方法实现成员变量的赋值取值,则要注意:
1.自己定义的getter(访问器)最好不要定义成get+属性名,例如:getName。因为,OC中底层的一些函数的实现已经占用了get方法。那么这时如果你这样定义,那么很可能造成冲突。一般我们直接用属性名(如name)作为访问器的关键字。
2.OC中得点语法的用法和C中稍有不同:在C中,你可以直接用p.name进行复值取值,但是在OC中你要注意,OC中用点语法给实例变量赋值,可直接用[email protected]“aaaaa”,但是取值就和C不一样了。取值的使用方法是“p.访问器关键字”。即:如果你定义的访问器是getName,那么你用点语法取实例变量name的值就要用p.getName,而不是p.name,这点要注意。
3.如果你没用@property 定义属性,而是自己定义访问器和设置器,那么如果你只定义了get,你就能用点语法的取值功能,如:NSLog(@"-------%@",p.name),但是不能用赋值功能set。反之也一样。
最后,只有设置为属性的或者自己定义了设置器访问器的实例变量才能使用点语法。
关于可见度:
@public 声明为公共的成员变量,不需要设置器和访问器就可以访问该变量,当然你也可以添加设置器访问器。访问的方式为p->name,只能用这种方式访问变量,否则会报错。