@proerty 和 @synthesize
@proerty:编译器指令,当我们在类的声明中使用 @property,它会自动生成标准的setter和getter方法的声明
@synthesize:
1、用类的实现中,可以生成setter和getter方法的实现
2、生成一个私有成员变量,这个私有的成员变量与@synthesize后面的名字一样
我们可以指定 @synthesize 生成setter 和getter放的时候使用哪个成员变量,这个时候它就不会生成与@synthesize 后面的名字同名的私有成员变量了
@synthesize age = _age;
当然还可以使用增强的#proerty和@synthesize,参考
Objective-C中的@property和@synthesize用法
http://blog.csdn.net/zhiganglet/article/details/7546333
需要注意的是
在使用@property增强的时候如何自定义setter方法
1、如果你实现自定义的setter方法,@property就不会帮你生成它的setter方法,但仍然会帮你生成getter方法和私有的成员变量
2、如果你实现自定义的getter方法,@property就不会帮你生成它的getter方法,但仍然会帮你生成setter方法和私有的成员变量
3、如果你同时实现自定义的setter 和 getter方法,@property就不会帮你生成它的setter 和 getter方法,同时也不会帮你生成私有成员变量了
id 类型 (类似C++11 的auto)
id 类型是一个万能对象指针类型,它可以指向任意类对象
id 类型本身就是一个指针类型,接收对象时候不要再加 * 了;
id:缺点:
所有它任意对象上的方法它都可以调用,但如果这个对象上不存在这个方法,那再运行时就报错
它不会进行编译时的检查
当是用id类的变量去调用一个方法的时候,它会提示很多类似方法,不容易找到自己对象上的方法
优点:在只有是同时实现了某些方法的对象上产生多态特性
id 也叫 类型动态类
静态类型: 特定类的类型
1、提供编译时,如果对象上没有这个方法就再编译的时候报错
2、写代码的时候它的提示比较准确
在一般情况我们使用的都是静态类型
例子:
#import "CZPerson.h"
#import "CZDog.h"
int main(int argc, const char * argv[]) {
CZPerson *person = [CZPerson new];
person.age = 10;
NSLog(@"%d",person.age);
// [person setName:@""];
id pi = person;
[pi setAge:20];
NSLog(@"%d",[pi age]);
// id类型不可以使用点语法,也不可以使用 ->
// pi.age = 40;
// [pi setName:@"haha"];
pi = [CZDog new];
[pi setAge:4];
NSLog(@"%d",[pi age]);
return 0;
}
私有方法 其实就C++的类的私有方法(也叫私有函数,只不过oc中这种方法不写在声明中,外部看不到而已)
//私有方法:不能在外界调用的方法,只有实现没有声明的方法
//OC只有在实现文件中的定义的这个方法是私有,但是不是绝对的私有;
//私有方法:就是不让外界调用方法
//如果在一个类的方法可以写成私有的就不要写成公开的
重写init方法
重写init必须要做三件事
1、必须要调用父类init
2、必须检验父类的init是否成功初始化
3、返回自己指针
//有时候需要在初始化的时候从外界传入一些值
//OC init family
//自定义自己的初始化方法
//1、必须以initWith开头
//2、返回值类型必须是id 或 instancetype
//不是init 家族的方法,就不可以给self赋值