//---------------------------类对象 应该如何理解类: 类 ----> 通俗理解就是一个"类型",可以创建对象(实例对象) 比如 Persson *p = [Person new]; -(Person *)run:(Person *)p; 类 ----> 类是一个"类类型的对象" (Class类型的对象) 1,类的本质其实也是一个对象(Class类型的对象); /* 类对象 类对象在程序运行时一直存在。 类对象是一种数据结构,存储类的基本信息:类大小,类名称,类的版本以及消息与函数的映射表等 每一个对象都包含一个指向其类对象的isa指针。 */ 2、类对象如何获取
# 通过实例对象获取 ------> [实例对象 class]; Dog *d1 = [Dog new]; Dog *d2 = [Dog new]; Class c = [d1 class]; Class c2 = [d2 class];
# 通过类名获取(类名其实就是类对象) -----> [类名 class]; Class c3 = [ Dog class ];
//因为类对象在整个程序中只存在一份,所以 c = c2 = c3
3.类对象的使用
# 1)可以用来调用类方法:
//获取类对象 Class c1 = [Person class]; //使用类对象调用类方法 [c1 test]; // test是一个+号方法
# 2)可以用来实例化实例对象 //获取类对象 Class c1 = [Person class]; //使用类对象创建实例对象 Person *p = [c1 new]; [p test]; // -test 调用对象方法
Person *p = [Person new];
# 类对象只能使用在等号右边
# 类对象可以作为方法的参数传递 --------------------------------------- 回顾: setter / get方法 @interface Person : NSObject { //实例变量 NSString *_name; int _age; float _height; float _weight; int _sex;
} 对象 -> _实例变量 ---> setter/get方法 -(void)setName:(NSString *)name{
_name = name;
} [对象 setName:@"xxx" ]; -(NSString *)name{
return _name;
} //调用 NSString *names = [对象 name]; //----------------------点语法 1. 传统setter, getter方法
-(void)setAge:(int)age{
_age = age;
}
-(int)age{
return _age;
} person.age -- "本质" --> 调用set/get方法 2. 点语法 本质上展开之后相当于调用setter, getter方法 "setter方法" p.age = 10; 展开之后等价于 [p setAge:10]; // setter方法 "get方法" NSString *name = p.age; 等价于NSString *name = [p name]; // getter方法
对象. 成员变量 展开之后到底是setter方法, 还是getter方法, 看在等号的左边还是右边, 如果是等号左边就是setter方法, 在等号右边是getter方法 "关键:" p.name = p.name; 等号左边 是 setter方法 等号右边 是 get方法 3. 点语法陷阱 : 在set方法使用self. - (void)setAge:(int)newAge { 总结: 在set/get方法中不要用self使用点语法
"点语法的陷阱 仅仅只是告诉大家点语法的本质是set/get方法的调用,开发中按照正确的方向写,不会写陷阱的样式"
}
2、点语法注意
1)点语法的本质是"set/get方法的调用,而不是访问成员变量",当使用点语法时,编译器会自动展开成相应的方法。
2)切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。
3)不是所有的方法都可以通过点语法调用,set/get一定可以用点语法,"OC中方法的调用是中括号 [ ]"
4) p.name 跟 p->_name 有本质的区别 p->_name 是 对象直接访问实例变量
|