OC课程笔记总结7-核心语法2:@property,@synthesize,id

课程:核心语法

关键字:@property,@synthesize

这两个关键字可以简化对成员变量的set和get方法的代码编写过程。类似于OC中的点语法。

对于成员变量的set和get方法的编写代码重复量很高,没有实际意义,代码类似,除了放回类型以及参数类型不同之外,其他都十分相似。

使用关键字@property可以让xcode编译器自动生成成员变量的set和get方法的声明。只是方法的声明,而不是实现。

格式:@property 成员变量类型 成员变量名(去掉变量名开头的下划线,如果保留下划线,则编译成自动生成的方法名也会包含下划线,实际中如果手动写set和get方法是不会加上下划线的)。编译器可以自动改首字母大小写,但是不会自动去除下划线。在指针*号和变量名之间可以有空格,编译器会忽略它们之间的空格。

xcode编译器在自动生成成员变量set和get上比较智能,使用@property 类型 成员变量名后,编译器会根据这条语句中的成员变量名(后面用变量名1来指代)来

生成实际的set和get方法声明,如果变量名1加上“_”(编译器自动加)符合在大括号中声明过的相应的变量名,那么实际生成的就是对应正确的set和get方法,如果在大括号声明中没有找到这样一个符合的变量名,那么编译器一样会自动生成set和get方法,只不过对应的是”_变量名1"这个成员变量(在大括号声明中找不到),即编译器会自动声明这么一个成员变量:“_变量名1”(作用域范围为private)。这个成员变量也会被加入到对象内存中,只不过不符合最初的编程思想,因此,在使用@property语句时要注意对变量名的书写。


自动生成set和get方法的实现:

关键字@synthesize。要使用synthesize关键字一定要先写property关键字定义好方法声明。格式如下:

成员变量声明: 类型名  _成员变量名1(以下划线开头);

@propety 类型名 成员变量名1(去掉下划线) ;

@synthesize 成员变量名1 去掉下划线)= _成员变量名1;             // 没有下划线的成员变量名1用于匹配对于的property,等号=后面的带有下划线的  _成员变量名1  表示实际作用于哪一个成员变量,因此要加上下划线。

如果不加上等号加以限制的话,默认对变量名为成员变量名1的变量进行操作。

如果要使用synthesize,那么一定要在声明中有一个property与之相匹配对应,并且如果在成员变量中没有声明过某一变量,单独使用property会自动声明加上下划线_的成员变量名,而如果同时使用了

synthesize,那么生成的是完全和synthesize中一样的成员变量名,即不会自动加上下划线。propert只能写在interface中,synthesize只能写在implementation中。

 声明对于程序的实际运行不是最重要的,实现才是最重要的,实现真实作用于对应的成员变量,声明只是为了方便阅读,所以,对于不同的部分,各个变量名之间的关系要匹配好。


对于同一类型的变量声明可以写在一个@property中,用逗号隔开,但实际开发中很少这么写,一般是每个变量用一个property。

而在最新版本的xcode中,只通过一句@property既声明成员变量(private)还声明了set和get方法并且还定义了方法,甚至连synthesize也可以不写了。

这样可以少写很多不必要的代码,但是有一个要注意的地方是,通过这种方法声明的成员变量是private属性的,如果希望子类中能够直接访问某个属性的话,还是要在大括号中声明这个属性。

如果自己定义有set或者get方法,那么即使使用了property也不会在自动生成重复的方法,以用户自定义的方法为准。同理,如果是自己定义了相关的方法,如果没有声明相对应的成员变量的话,

还是会自动生成相应的private变量。这些细节都可以自己稍微修改代码进行测试一下得出结果。不必强记。

新版本的 xcode 中,@property 即声明了方法也实现了方法,并且,对于 property 来说,会自动生成没有的方法,比如说已经自己编写了 set 或者 get 方法,那么 property就只会自动生成 get 或者 set 方法,对于已经存在的方法是不会再自动生成的,一切以程序员自定义的为主,以人为主。



类型:id

id,id其实是一种类型,可以用于定义变量。id相当于一个万能的指针,但是这个指针不能加*号修饰,id 可以(指向)操作任何OC对象。

id是一种类型,可以定义属于这种类型的变量来指向任何oc的对象,而不是通过相同类型的对象指针来指向对象。并且记住在定义id类型变量的时候,不能加 * 号。可以将id 理解为 NSObject *,即一个超类的指针,因为所有的oc类都继承了NSObject类(实际上有差别,可以类似理解)。id 的作用之一是用于定义函数的参数类型,这样的参数可以接收任意的oc 对象。另一种常见用法是用于表示返回类型,说明一个函数可以返回任意类型的对象。oc对象的本质是一种结构体。即对象实际是一种结构体。





















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值