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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wuxiaoling 中级黑马   /  2015-11-18 22:51  /  1023 人查看  /  4 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

一 类的设计与匿名对象
  • /*
  • 类设计练习
  • 1.设计一个人类,每个人都有姓名,生日,性别.每个人都有说话与笑的方法.
  • 2.设计一个家庭类有在三个成员,父亲 母亲 孩子.
  • 注意:类的属性可以是任意类型
  • 2.在类的设计的时候,注意尽量高内聚,低耦合.
  • 有关联的属性尽量封装成一个模块,以实现高内聚.而模块与模块之间要尽量独立,以实现低耦合.---类的设计原则
  • */
  • #import <Foundation/Foundation.h>
  • typedef struct{
  •     int year;
  •     int month;
  •     int day;
  • } Date;
  • typedef enum{
  •     MAN,
  •     WOMAN,
  • }SEX;
  • //定义一个人类
  • @interface Person : NSObject{
  •     @public
  •     char *name;//姓名
  •     Date birthDay;//生日
  •     SEX sex;//性别

  • }
  • -(void) talk:(char *) s;//说话的方法
  • -(void) smile;//笑
  • -(void) printMe;//打印自已的属性
  • @end
  • @implementation Person
  • -(void) talk:(char *) s{
  •    NSLog(@"%s讲了一句话:%s",name,s);
  • }
  • -(void) smile{
  •     NSLog(@"%s笑了...",name);
  • }
  • -(void) printMe{
  •     NSLog(@"姓名:%s,生日:%d年-%d月-%d日,性别:%d",name,birthDay.year,birthDay.month,birthDay.day,sex);
  • }
  • @end
  • //定义一个家庭类
  • @interface Family : NSObject{
  •     @public
  •     Person* dad;//
    记住容易搞混的地方.不要看作指针,就看做是对象里面的成员变量,Person*相当于成员变量名的类型,dad是变量名;以后在类嵌套的时候把一个嵌套的类当作成员变量的格式
  •    Person* mom;//对象类型的指针来表示变量
  •    Person* child;
  • }
  • -(void) printAll;
  • @end
  • @implementation Family
  • -(void) printAll{
  •     [dad printMe];
  •     [mom printMe];
  •     [child printMe];
  • }
  • @end
  • int main(){
  •     //创建对象
  •     Person * p=[Person new];
  •     //给属性赋值
  •     p->name="fred";
  •     //给生日结构体赋值
  •     p->birthDay.year=1980;
  •     p->birthDay.month=1;
  •     p->birthDay.day=1;
  •    //性别赋值
  •     p->sex=MAN;
  • /*    NSLog(@"姓名:%s,生日:%d年-%d月-%d日,性别:%d",p->name,p->birthDay.year,p->birthDay.month,p->birthDay.day,p->sex);
  •     [p printMe];
  •      [p printMe];
  •      [p printMe];
  •     //方法测试
  •     [p talk:"haha"];
  •     [p smile];
  •      [p printMe];
  •     //给家庭类的三个成员赋值
  •     //1.创建家庭类的对象
  •     Family* f=[Family new];
  •     //给每个在员赋值
  •     f->dad=p;
  •     //创建一个对象:母亲
  •     Person * mom=[Person new];
  •     //给属性赋值
  •     mom->name="mary"
  •     //给生日结构体赋值
  •     mom->birthDay.year=1982;
  •     mom->birthDay.month=2;
  •     mom->birthDay.day=14;
  •     //性别赋值
  •    mom->sex=WOMAN;
  •     f->mom=mom;
  •     //创建一个对象:小孩
  •     Person * child=[Person new];
  •     //给属性赋值
  •     child->name="AA";
  •     //给生日结构体赋值
  •     child->birthDay.year=2004;
  •     child->birthDay.month=5;
  •     child->birthDay.day=18;
  •     //性别赋值
  •     child->sex=MAN
  •     f->child=child;
  • //    Person *pdad=f->dad;
  • //    [pdad printMe];
  • //    [f->dad printMe];
  • //     [f->mom printMe];
  • //     [f->child printMe];
  •     [f printAll]
  •     return 0;}

1.一个类中的属性可以是任何类型
2.类设计的两个原则,高内聚与低耦合
高内聚:就是有关联的属性要封装起来,成为一个单一的模块//对于类而言
低耦合 : 就是一个类中各模块应该尽量独立//对于项目而言
3.一个对象可以没有变量名直接使用,这个对象就称为匿名对象
如下:[Person new]->age;//直接用对象获取属性,而不是对象的指针//用完就销毁,下次你没有办法再次引用
给对象中的一个char* name赋值时,p->name="frame";和C语言一样注意%s和%@的用法
file:///var/folders/r_/3xqc6gh50w589cz485_g9nph0000gn/T/WizNote/d44b4278-ba24-4d6f-8af0-2826c273f9c3/index_files/7748027.png

二 类与对象的内存机制
1.属性(成员变量)是在对象里
2.方法是在类中
3.对象与类都会在内存开辟空间
同一个类的对象都含有这个类的一个isa指针,所有的对象都指向同一个类
4.对象的指针调用方法时,实际是发了一个消息给对象,对象根据消息去找isa指针指向的类中对应的方法去执行
5.方法中如果调用属性,则是哪个对象的请求,就调用哪个对象的属性













4 个回复

倒序浏览
不错
回复 使用道具 举报
不错!笔记是个好习惯
回复 使用道具 举报
不错不错,学习了
回复 使用道具 举报
记笔记是种好习惯
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马