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

------<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;

@end
2.Student.m
#import "Student.h"

@implementation Student

- (void)setAge:(int)newAge {
    age = newAge;
}

- (int)age {
    return age;
}

@end

3.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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值