关于OC中成员变量,属性的一些基本知识(针对初学者)

嘛,第一次写博客,先贫两句吧。

我一直都很懒,总之就是没人让我做事的话我一般是不会主动找事做的。

然,前两天和一个同样做iOS的朋友聊天,他说他经常写一些博客,然后balabaleba的说了好多写博客的好处。

我只记住了写博客能让我们变得越来越NB这一条了,嗯。

所以,我决定要养成写博客的“NB”习惯~

刚开始,就从简单的开始说起吧。

下面进入正题:

相信很多初学者都对OC中得点语法和->的使用比较模糊,下面我来给大家做详细的说明。

属性一般不加下划线

声明的属性对应setter方法中的形参,而不是实例变量,这一点一定要注意

注意:实现属性的时候,name=_name代表将形参和实例变量建立关系,而不是赋值

可以把相同类型的属性定义在一行,但是最好不要这么做,因为这样会降低程序的可读性,我们一般都是一个属性定义一次.


@synthesize name=_name; 可以省略(但如果你自己又重写了gettersetter,就不能省了),如果你定义了实例变量_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);//可以用点语法取属性值


属性也可以用gettersetter,如:


[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中用点语法给实例变量赋值,可直接用p.name=@“aaaaa”,但是取值就和C不一样了。取值的使用方法是“p.访问器关键字。即:如果你定义的访问器是getName,那么你用点语法取实例变量name的值就要用p.getName,而不是p.name,这点要注意。


3.如果你没用@property 定义属性,而是自己定义访问器和设置器,那么如果你只定义了get,你就能用点语法的取值功能,如:NSLog(@"-------%@",p.name),但是不能用赋值功能set。反之也一样。


最后,只有设置为属性的或者自己定义了设置器访问器的实例变量才能使用点语法。


关于可见度:

@public 声明为公共的成员变量,不需要设置器和访问器就可以访问该变量,当然你也可以添加设置器访问器。访问的方式为p->name,只能用这种方式访问变量,否则会报错。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值