黑马程序员————Objective C——点语法和分类

来源:互联网 发布:java比较三个数的大小 编辑:程序博客网 时间:2024/04/30 09:34

------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一、点语法概念

   在Java中,我们可以通过"对象名.成员变量名"来访问对象的公共成员变量,这个就称为"点语法"。

  1.传统的get方法和set方法

    先来看一下传统的get方法和set方法。定义一个Student类,拥有一个成员变量age和对应的get\set方法。

1.Student.h   #import <Foundation/Foundation.h>@interface Student : NSObject {    int age;}- (void)setAge:(int)newAge;- (int)age;@end2.Student.m#import "Student.h"@implementation Student- (void)setAge:(int)newAge {    age = newAge;}- (int)age {    return age;}@end3.main.m#import <Foundation/Foundation.h>#import "Student.h"int main(int argc, const char * argv[]){    @autoreleasepool {        Student *stu = [[Student alloc] init];                // 设置age的值        [stu setAge:10];                // 取出age的值        int age = [stu age];                NSLog(@"age is %i", age);                [stu release];    }    return 0;}

   2.使用点语法代替传统的get方法和set方法

     上面演示了OC传统get\set方法的简单用法,接下来使用点语法来代替。

     前面main.m中main函数的代码可以改为


int main(int argc, const char * argv[]){    @autoreleasepool {        Student *stu = [[Student alloc] init];                // 设置age的值        stu.age = 10; // 等价于[stu setAge:10];                // 取出age的值        int age = stu.age; // 等价于int age = [stu age];                NSLog(@"age is %i", age);                [stu release];    }    return 0;}

    3.注意第7行代码,把原来的[stu setAge:10]替换成了stu.age = 10。听清楚了,这两种写法是完全等价的。即这里的stu.age并不是代表直接访问stu对象的成员变量age,而是编译器遇到stu.age = 10的时候会自动将代码展开成[stu setAge:10]

再说,如果是直接访问成员变量的话,OC中应该是这样的语法:stu->age,而不是stu.age。

    4.注意第10行代码,把原来的int age = [stu age]替换成了int age = stu.age。这两种写法又是完全等价的,stu.age并不是直接访问stu对象的成员变量age,而是编译器遇到int age = stu.age的时候会自动将代码展开成int age = [stu age]


    5.因此,OC中点语法的含义跟Java是完全不一样的,OC点语法的本质是方法调用,不是直接访问成员变量。至于这个点语法代表的是get方法还是set方法,那就取决于你是取值还是设值,取值就是get方法(如第10行代码),设值就是set方法(如第7行代码)。

二、分类-Category

   1.分类的作用

     在不改变原来类内容的基础上,可以为类增加一些方法
   2.使用注意:
     1>分类只能增加方法,不能增加成员变量
     2>分类方法实现中可以访问原来类中声明的成员变量
     3>分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
     4>方法调用的优先级:分类(最后参与编译的分类优先) --> 原来类  --> 父类

   3.格式
   1>分类的声明
    @interface 类名 (分类名称)
     // 方法声明
    @end
   2>分类的实现
    @implementation 类名 (分类名称)
     // 方法实现
    @end

   4.好处
   一个庞大的类可以分模块开发
   一个庞大的类可以由多个人来编写,更有利于团队合作
 5.给系统自带的类添加分类
   给NSString增加一个类方法:计算某个字符串中阿拉伯数字的个数
   给NSString增加一个对象方法:计算当前字符串中阿拉伯数字的个数

   6.注意
   Category可以访问原始类的实例变量,但不能添加变量,只能添加方法。如果想添加变量,可以考虑通过继承创建子类。
   Category可以实现原始类的方法,但不推荐这么做,因为它是直接替换掉原来的方法,这么做的后果是再也不能访问原来的方法。
   多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效。







0 0
原创粉丝点击