A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© z276698840 中级黑马   /  2016-3-29 08:22  /  1147 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

//---------------------------类对象
应该如何理解类:
    类   ---->  通俗理解就是一个"类型",可以创建对象(实例对象)
比如     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 是 对象直接访问实例变量





评分

参与人数 2黑马币 +9 收起 理由
tun + 6 赞一个!
crg + 3 很给力!很有用已收下

查看全部评分

4 个回复

倒序浏览
回复 使用道具 举报
赞一个
回复 使用道具 举报
赞                                    
回复 使用道具 举报
感谢分享
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马