OC学习笔记之OC类使用篇

 

一、OC类的三种访问属性
    
和C++一样OC类也有三种访问属性,@public,@private,@protected。但是OC还多出一个 @package。
       @public 公有访问属性,字如其义,被声明为公有属性时,类的数据成员不管是在类内部还是在类外部都是可见的,即在类外也可以直接访问类的数据成员,在C中的结构体中就是这种属性,但是为了不破坏封装性,非必要的情况下不使用这种属性。
        @private 私有访问属性,这种属性在类中是可见的,在类中的方法可以访问,当然类方法除外。(读者可能会问,什么是类方法,这里小桥稍微说下,OC中的类方法和C++中的静态方法有点相似,是在对象创建之前就可以调用的方法,所以在类对象创建之前当然不能访问类的成员变量)在类外或者派生类中不可见,即不能直接访问,只能通过方法间接地访问。
        @protected 保护访问属性,在类和派生类中都可以直接访问。需要注意的是,OC类中的默认属性就是保护属性,而C++中默认是私有属性。所以在OC中这种属性用的最多。 

二、对象方法与类方法
      在 C++中有静态方法和非静态方法,OC中有对象方法和类方法,二者虽然不同但也有相似的地方。
       对象方法: 顾名思义是对象使用的方法,这里的对象就是类的具体对象,对它的调用只能在实例化对象以后,通过对象调用,它可以访问数据成员。表现在类中的方法声明是以 - 减号开头,如
                                    
- ( void )setStudent_ID:( char *)student_ID;
        类方法: 是类独有的方法,它只能通过类来调用而不能通过对象调用,所以可以不用实例对象而使用类方法,提高了程序的效率,但是它不能访问数据成员。表现在类中的方法声明是以 + 加号开头,如
                                    
+ ( void )print;  
        
三、开始使用类
    先上代码:

//
//  main.m
//  2
//
//  Created by 葬花桥 on 14-4-22.
//  Copyright (c) 2014年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h>
//类的声明
@interface Student :NSObject
{
    @package
    //成员变量
   char*    _student_ID;
   unsigned    _grade;
   unsigned    _age;
}
//对象方法的声明
//(void)是返回类型 setStudent_ID:是方法名,(char*)是参数类型
- (void)setStudent_ID:(char*)student_ID;
- (void)student_ID;
//类方法声明 
+ (void)print;

@end

//类的实现
@implementation Student

- (void)setStudent_ID:(char*)student_ID
{
   _student_ID = student_ID;
    
    
}
- (void)student_ID;
{
    NSLog(@"学号为:%s",_student_ID);
}
//类方法实现 
+ (void)print
{
    NSLog(@"调用了类方法!");
}
@end
int main()
{
   Student* Qiao = [Studentnew];
   char *p;
    p = "2011040131063";
    [QiaosetStudent_ID:p];
    [Qiaostudent_ID];

   return0;
}


        上面用到的类是上篇笔记中的,加了一个类方法 ,重点是main函数,因为在这里使用到了类。在main函数中的第一句, Student * Qiao = [ Student   new ]; 右边中括号这句  [ Student   new ] 就是OC中方法的调用了,OC方法调用是在中括号中完成的,左边 Student 是动作主体,右边 new 是动作,这就是OC中的消息驱动机制,有点像windows消息机制, [ Student   new ] 表示发出一个new消息给Student,相当于Student调用new方法。听起来有点绕。。。。。。。总之记住OC就是这样调用方法,见得多了就熟悉了,小桥就是这样阿Q一下。
   另外,有读者可能会问,Student没有 new 这个方法啊,是的确实没有,小桥没有写这个方法。但是,前面小桥说过,一个类要实例对象就要继承基类 NSObject,这里调用new方法就是为了实例一个对象,所以Student继承了它,继承之后,Student类就同时继承了基类的一些方法,比如这里的new,当然还有其它很多方法和成员。
   上面说过对象方法和类方法,这里的new就是类方法了,因为它是发送给了Student这个类的,而不是Student对象。
   再说一下
[ Student   new ];的作用,它执行完后,在内存中就有了一个Student类的对象,这个对象中的成员变量同时也被初始化为了 0,但是我们不知道这个对象在哪里,所以此时的 [ Student   new ]对象是一个匿名对象,我们可以用一个指针指向这个对象的地址,这就是   Student * Qiao = [ Student   new ];的作用了。执行这条语句后,Qiao这个指针就指向了内存中的这个对象,我们可以粗略地把Qiao就看成是Student的一个对象。为什么小桥要这么做,实例化一个对象,定义一个指针,然后指针再指向这个对象?因为OC中只有这一种写法,实例化对象就要这么写,没有C++中那么多写法,OC中只能通过指针去对对象进行操作。下面是简单图示:

四、对象方法的调用
   小桥再说下这条语句 
[Qiao setStudent_ID:p];两样的,中括号是方法调用,向Qiao发送一条消息setStudent_ID: ,参数为p 。执行这条语句时,Qiao指向的对象就会查找setStudent_ID:方法。怎么查找呢?在对象的内存中找?答案是否定的,读者看上面的图,小桥不是没有画出对象的方法,而是对象在内存就没有方法,方法是在类中,在[Student new]执行这条语句前,Student类就被加载到了内存,其中就包含对象方法和类方法。
对象要调用方法,是通过isa指针找到它的类,再在类中找到相应的对象方法就可以了。
    isa指针同new一样也是从基类NSObject中继承而来的,每个对象中都有isa指针,它指向所属的类,调用方法就通过它找到类,再在类中找方法,所以说,对象本身在内存中没有方法,所有对象共用类在内存中的那份方法。可以看看下面的图示:

    执行这条语句后,Qiao指向的对象中的_student_ID就被设置成了 2011040131063 再执行
 
[Qiao student_ID];就能输出学号。这里为什么要通过set方法来设置学号呢,难道不能直接
Qiao->_student_ID = "2011040131063"; ? 这样是可以的,但是在上一篇笔记小桥说过,OC类的默认访问属性是protected保护属性,所以在类外的main中直接访问数据成员就要将数据成员的访问属性设为public公有。
    这里还有一个没说,那就是类方法使用,其实也算是说过了, 和
[Student new]一样,要调用print方法也要[Student print]这样写,因为print是类方法,如果只调用这个方法,前面就可以不实例化对象Qiao。
    OK,关于OC类的使用小桥就简单地说到这儿,读者如果想学得更多,建议百度更多相关内容。 

    




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值