黑马程序员技术交流社区

标题: OC基础类与对象详细剖析哦 [打印本页]

作者: songxuefeng    时间: 2016-3-25 01:59
标题: OC基础类与对象详细剖析哦
//-----------------------对象存储细节
1. 当创建一个对象的时候:Person *p1 = [Person new] 做了三件事情:

    1)申请堆内存空间;
    1)给实例变量初始化
    1)返回所申请空间的首地址;


2. 实例变量保存在堆区

3. 对象方法保存在代码区

4. 一个类可以创建多个对象;

'高地址'

        栈区
        堆区
        全局区(静态区)  (BSS段,数据段)
        代码区

'低地址'


只要new一下,就会在堆区开辟一个空间


//分析:
    Person *p1 = [Person new];

类的信息     ------>  代码区

p1(局部变量) ------>  栈区 (代码段结束  释放)

[Person new] ----->  堆区



//-----------------------函数和对象方法的区别

# 对象方法

-(void)run;

(1)对象方法的实现在@implementation...@end中

对象方法的声明只能写在 @interface...@end中间

(2)对象方法都以-号开头

(3)对象方法只能由对象来调用

(4)对象方法归对象所有

(5)对象方法可以"直接使用"实例变量

-----------------------------------------------
#   函数

函数: void run(){
}

(1)所有的函数都是平行的
(2)函数不存在隶属关系
(3)使用的时候可以直接调用
(4)不可以访问对象中的成员变量
(5)函数属于整个文件,可以写在文件中的任何位置,包括@implementation...@end中,但写在 @interface...@end会无法识别,函数的声明可以在main函数内部也可以在main函数外部。

函数不允许嵌套定义,可以嵌套调用


//------------------常见错误汇总
1)@interface @end和@implementation @end不能嵌套包含

2)只有类的声明没有类的实现
只有@interface没有@implementation时,程序编译能够通过,但是执行报错

3)漏写@end

4)两个类的对象声明顺序(可以把顺序打乱)

5)成员变量没有写在{}里    错误的

6)方法的声明写在了{}里面  错误的

7)在声明时不能对类的成员变量进行初始化,请注意成员变量不能脱离对象而独立存在

8)方法无法像函数那样的调用(对象方法必须由对象来调用)

10)类的实现可以写在main函数后面,在使用之前只要有声明就可以

#warning 列举这些常见错误,是为了告诉大家要往正确的方向去学习去编写代码.把自己编写代码的习惯更正过来



//-------类的声明
@interface <#class name#> : <#superclass#>
@end

//------类的实现
@implementation <#class#>
<#methods#>
@end

//------主函数
int main(){
    return 0;
}


//--------------------------------
@try {
    //有可能出错的代码
}
@catch (NSException *exception) {
    //扑捉
}
@finally {
    //都执行
}

解释:
@try   有可能出错的代码出错了 才会执行 @catch里面的代码
       如果@try里面的代码没出错@catch不会走

@finally   不管有没有异常都会执行




//------------------对象和方法之间的关系
-(返回值)方法名1:(参数类型) 参数名;


//(1),对象作为方法的参数
-(void) displayPerson:(Person *)person{
    NSLog("姓名:%@",person->name);
}

//(2),对象作为方法的返回值
-(Person *)changePerson:(Person *)person{
    person->name = @"唐僧";
    return person;
}






@interface Person : NSObject
{
   
    int _age;
}


//----------------------------------


-(void)putPerson:(Person *)person;


-(Person *)getPerson;



-(Person *)showPerson:(Person *)person;



//---------------------------------------

@end

@implementation Person


@end


int main(){
   

    //创建一个对象
    Person *person = [Person new];
   
    //  类名:  首字母大写 Person
    //  对象名           person
   
    //由对象调用        传递到putPerson方法里的参数
    [person putPerson:person];
   
}

//----------------练习1分析
-(BOOL)compareColorWithOther:(Dog *)dog{
   
    //拿当前的狗的颜色和另外一条狗的颜色比较
    if(_color == dog->_color){
        
        return YES;
        
    }
   
    return NO;
   
}
# 分析   :
1.这是一个对象方法
2.返回值类型为 BOOL
3.方法名为: compareColorWithOther:
4.有参数,参数类型为Dog *类型

_color         哪个对象调用这个方法, _color就是那个对象的_color
dog->_color    传进来的dog的_color


//----------------练习2分析
//关联关系(之后还会着重讲)   人拥有狗这个成员变量
@interface Person : NSObject
{
    @public
    Dog *_dog;  //null      关联关系    Person对象里面拥有了一个Dog对象
}

......

Person *p = [Person new];
//给p一个dog
p->_dog = d1;  //人拥有d1这只狗

//人的方法
-(void)feedDog:(Dog*)dog{    //  人的方法   由人调用这个方法
   
   
    //  狗要吃  --->  找狗
    [对象 eat];
   
    //  1.找对象   没有?  3个方法
   
    // 1.  _dog  人拥有这个对象(人的实例变量)  (理解)
   
    // 2.  作为参数传递进来

    // 3.   new一个狗
   
   
}


nil 调用任何方法不会有效果



_dog  赋值

//-----------------对象作为方法的参数连续传递

1.人   拥有开枪的行为
2.枪   拥有发射子弹的行为
3.子弹 控制子弹数的减少

-(void)fireByGun:(Gun *)gun andBullet:(Bullet *)bullet{
    //让枪射击
    //把子弹传递给 枪
    [gun shoot:bullet];
   
}


-(void)shoot:(Bullet *)bullet{
   
    //开枪应该做哪些事情?
   
    //如果 子弹的个数 > 0 可以减-1
    if(bullet->_bulletCount>0){
        
        // 1) 子弹数 -1
        bullet->_bulletCount --;  // bullet->_bulletCount = billet->_bulletCount -1;
        // 2) 打印机剩余的子弹数
        NSLog(@"biu biu biu....剩余子弹数:%d",bullet->_bulletCount);
        
    }else{
        
        NSLog(@"都没有子弹了,你还突突个毛线~");
        
    }
   
}


/*  练习方法
1----看到题目  写代码  习惯写注释
2----看着题目  写伪代码  写完伪代码  可以尝试敲代码
3----copy题目  copy伪代码  尝试去写代码
4----打开现成代码   看懂这个代码  对着敲  至少也得敲3遍,然后得自己独立敲出来
*/



今晚思考:
/*

 设计一个”学生“类
 1> 属性
 * 姓名  name
 * 生日  birthday


用结构体作为类的实例变量(生日)


*/

//------结构体作为类的实例变量。给结构体赋值的三种方法:
typedef struct {
   
    //年
    int year;
    //月
    int month;
    //日
    int day;
   
}MyDate;

//第一种:直接赋值,并强转;
stu->_birthday =(MyDate){1983,12,12};//直接赋值,并强转;

//第二种:先定义,然后在赋值
MyDate d1 = {1981,11,11};  //定义结构体变量的同时进行初始化
stu->_birthday = d1;

//第三种方法,逐个赋值
stu->_birthday.year = 2014;
stu->_birthday.month = 12;
stu->_birthday.day = 11;





作者: 彼岸花开    时间: 2016-3-25 02:25
太棒了,赞一个...
作者: 910428147    时间: 2016-3-25 03:23
好长。。腻害!
作者: y977975092    时间: 2016-3-25 06:23
。。。。。。。。。。。。。
作者: chenglei2016    时间: 2016-3-25 20:09
好详细
作者: 彼岸花开    时间: 2016-3-26 00:23
给力,赞一个




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2