1.点语法的介绍 1、使用“点语法” Student*stu = [[Studentalloc] init]; // 设置age的值 stu.age= 10; // 等价于[stu setAge:10]; // 取出age的值 int age = stu.age; // 等价于int age = [stu age]; NSLog(@"age is %i", age); 这里的stu.age并不是代表直接访问stu对象的成员变量age,而是编译器遇到stu.age = 10的时候会自动将代码展开成[stu setAge:10] 把原来的int age = [stu age]替换成了int age = stu.age。这两种写法又是完全等价的, stu.age并不是直接访问stu对象的成员变量age,而是编译器遇到int age = stu.age的时候会自动将代码展开成int age = [stu age]
OC点语法的本质是方法调用,不是直接访问成员变量。至于这个点语法代表的是get方法还是set方法, 那就取决于你是取值还是设值(也可以理解为点语法是在“=”的左侧还是右侧,左侧:如 stu.age=…. 这就是调用set方法,右侧 … = stu.age 这就是调用get方法), 取值就是get方法,设值就是set方法 点语法的本质是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。 切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。
2.@property和 @synthesize
@property是编译器的指令 什么是编译器的指令,编译器指令就是用来告诉编译器要做什么 @property 告诉编译器声明属性的访问器(getter/setter)方法 @property 类型 方法名
在老式的代码中: @property只能写在@interface @end中 @property 用来自动生成成员变量的get/set方法声明(xcode4.4以前) 告诉property要生成的get/set方法声明的成员变量类型是什么 告诉property要生成的get/set方法是哪个属性的,属性名称去掉下划线 @synthesize是在m文件中定义set和get方法的实现。和@property配合使用..........但是,现在时代不同啦
@property的增强使用: 只使用@property 进行声明,类自动帮你实现。 xcode4.4以后property做了增强 帮助我们自动生成get/set方法的声明 帮助我们自动生成get/set方法的实现 如果没有手动声明成员变量,perperty会在.m文件中自动帮我们生成一个_开头的成员变量。但是如果想让子类继承父类的成员变量,还是必须在.h中手动写成员变量。
1)如果手动实现了set方法,那么编译器就只生成get方法和成员变量; 2)如果手动实现了get方法,那么编译器就只生成set方法和成员变量; 3)如果set和get方法都是手动实现的,那么编译器将不会生成成员变量,并且报错。因为编译器觉得你在玩弄它,呵呵。
3.动态类型和静态类型
多态:允许不同的类定义相同的方法。 动态类型:程序直到执行时才能确定所属的类。 Animal *ani = [Dog new]; 静态类型:将一个变量定义为特定类的对象时,使用的是静态形态。Animal *ani = [Animal new];
4.id类型以及应用
id类型是一种通用的对象类型,它可以用来存储属于任何类的对象。也可以理解为万能指针。 在id的定义中,已经包好了*号。id指针只能指向oc的对象。
id类型的定义 Classisa; Typedefstructobjcobject{ }*id; 局限性:调用一个不存在的方法,编译器会马上报错。 iOS5之后推出了instancetype类型 相同点
1)instancetype和id的异同 不同点 2)都可以作为方法的返回类型 ①instancetype可以返回和方法所在类相同类型的对象,id只能返回未知类型的对象; ②instancetype只能作为返回值,不能像id那样作为参数。
|