一 Category

分类:Category(类目,类别) (OC有)

命名:原来的类+类别名(原来的类名自动生成,只要写后面的类别名,一般以模块名为名。比如原来类 Person,新建分类 Ct,新建的分类名为 Person+Ct )

作用: 在不改变原来类的内容的情况下,可以给原来的类添加一些新的方法

注意:

1)分类只能增加方法,不能增加成员变量。

2)分类方法的实现中,可以访问原来类中的成员变量。

3)分类可以重写原来类的方法。但是会覆盖原来类的方法(一般不会再分类当中重写原来类的方法)。

4)调用优先级:分类优先(最后参与编译的分类会优先调用)。

1. 创建一个OC类

New File -> iOS -> CoCoa Touch Class ,新建一个类 Person

Person.h

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Person : NSObject
  4.  
  5. @property int age;
  6.  
  7. - (void) showInfo;
  8.  
  9. @end

Person.m

  1. #import "Person.h"
  2.  
  3. @implementation Person
  4.  
  5. - (void)showInfo{
  6. NSLog(@"人的年龄是%d", _age);
  7.  
  8. }
  9.  
  10. @end

2. 新建一个分类

New File -> iOS -> CoCoa Touch Class ,新建一个分类 Ct1 ,File Type选择 Category ,Class 填为 Person (表示的是Person类的分类)

Person+Ct1.h

  1. #import "Person.h"
  2.  
  3. @interface Person (Ct1)
  4.  
  5. - (void) run;
  6.  
  7. @end

Person+Ct1.m

  1. #import "Person+Ct1.h"
  2.  
  3. @implementation Person (Ct1)
  4.  
  5. - (void)run{
  6. NSLog(@"调用了 run()方法");
  7. }
  8. @end

3.测试

main.m

  1. #import <Foundation/Foundation.h>
  2. #import "Person.h"
  3. #import "Person+Ct1.h"
  4.  
  5. int main(int argc, const char * argv[]) {
  6. Person *p = [[Person alloc]init];
  7. p.age = ;
  8. [p showInfo];
  9. [p run];
  10.  
  11. return ;
  12. }

第2行: 导入Person类的头文件。

第3行:导入Person的分类头文件。

第9行是:person 对象调用的分类方法 run。

二 类的本质

1.类的本质是类本身也是一个对象,是个Class类型对象,简称类对象。

利用Class创建Person类对象。

利用Person类对象 ,创建Person类型的对象。

1.1获取内存中的类对象

  1. Class c =[p class];
  2. Class c2 =[p2 class];

1.2获取内存中的类对象

  1. Class c3 = [Person class]

当程序启动时,就会加载一次项目中所有的类。类加载完之后,就会调用这个+load方法。(分类,本身类程序启动时都会调用,)

必须使用类,当类第一次使用时调用,就会调用 + initialize方法。(分类,本身类,有分类只会调用分类)

先加载父类的,在加载子类的(先调用父类的 +load,在调用子类的 +load )

先调用父类的初始化方法,在调用子类的初始化方法( + initialize)。

面试题:监听什么时候调用这个类,使用的方法。

  1. + (void) initialize{
  2. }

三 description

重写对象的字符串输出。

四 SEL

SEL:全称Selector 表示方法的存储位置

  1. Person *p=[[Person alloc] init];
  2. [p test];

寻找方法的过程:

(1)首先把test这个方法名包装成sel类型的数据;

(2)根据SEL数据找到对应的方法地址;

(3)根据方法地址调用相应的方法。

(4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。

注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。

Person.h

  1. #import <Foundation/Foundation.h>
  2.  
  3. @interface Person : NSObject
  4.  
  5. @property NSString *name;
  6. @property int age;
  7.  
  8. - (void) run;
  9. - (void) showAge:(int)age WithName:(NSString *)name ;

Person.m

  1. #import "Person.h"
  2.  
  3. @implementation Person
  4.  
  5. - (void)run{
  6. NSLog(@"名字是%@,年龄是%d的人正在跑步。", _name, _age);
  7.  
  8. }
  9.  
  10. - (void)showAge:(int)age WithName:(NSString *)name{
  11.  
  12. NSLog(@"age=%@,name=%@",age,name);
  13. }
  14.  
  15. @end

测试 @selector

  1. Person *p = [[Person alloc]init];
  2. p.name = @"wangwu";
  3. p.age = ;
  4.  
  5. NSObject *age1 = @;
  6. id age2 = @;
  7. [p performSelector: @selector(showAge:WithName:) withObject: age1 withObject: @"lisi" ];

五 NSLog

  1. Person *p1= [Person alloc];
  2.  
  3. //<类名: 内存地址>
  4. NSLog(@"%@", p1);
  5.  
  6. // 指针变量的地址
  7. NSLog(@"%p", p1);
  8.  
  9. //打印对象的地址
  10. NSLog(@"%p", &p1);
  11.  
  12. //输出行号
  13. NSLog(@"%d" , __LINE__ );
  14.  
  15. //输出C语言中的字符串,不能有中文
  16. NSLog(@"%s" , __FILE__);
  17.  
  18. //输出C语言中的字符串,可以有有中文
  19. printf("%s\n", __FILE__);

引用博客:

http://www.cnblogs.com/wenxp2006/archive/2012/05/14/2499329.html

http://www.cnblogs.com/qingyuan/p/3618305.html

http://www.cnblogs.com/qingyuan/p/3617086.html

IOS基础之 (七) 分类Category的更多相关文章

  1. 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol

    关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...

  2. iOS之分类(category)

    1.分类(category)的作用 1.1作用:可以在不修改原来类的基础上,为一个类扩展方法.1.2最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? 2.1分类中只能添加“方法”,不能增加 ...

  3. iOS中 分类(category)与扩展(Extension)的区别?

    1.分类(category)的作用 (1).作用:可以在不修改原来类的基础上,为一个类扩展方法.(2).最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? (1).分类中只能添加“方法”,不 ...

  4. 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解

    本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...

  5. 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别

    1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...

  6. OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法

    一. 分类-Category 1. 基本用途:Category  分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...

  7. Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考

    总结:继承.分类(Category.extension).协议(protocol)   一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...

  8. iOS基础UI控件介绍-Swift版

    iOS基础UI控件总结 iOS基础控件包括以下几类: 1.继承自NSObject:(暂列为控件) UIColor //颜色 UIImage //图像 2.继承自UIView: 只能相应手势UIGest ...

  9. IOS基础学习-2: UIButton

    IOS基础学习-2: UIButton   UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...

随机推荐

  1. spring核心组件

    spring的对象是bean组件,就像面向对象的object,bean包装的是object.context的作用,发现每个bean之间的关系,为他们之间建立好这种关系并进行维护.所以,可以把conte ...

  2. Gradle命令行操作

    任务排除 gradle task1 -x task2 task2就是被排除的任务,同时task2依赖的任务也会被排除掉 守护进行执行 默认情况下,每次构建,都要启动一次JVM, gradle -dae ...

  3. ubuntu 查看软件包版本以及软件包的源码

    aptitude show  xxx sudo apt-cache show autoconf setattr, getattr, setattr http://ju.outofmemory.cn/e ...

  4. Delphi7下SuperObject的JSON使用方法

    uses superobject; procedure TForm1.FormCreate(Sender: TObject); var aJson: ISuperObject; aSuperArray ...

  5. pandas 修改 DataFrame 列名

    问题: 有一个DataFrame,列名为:['$a', '$b', '$c', '$d', '$e'] 现需要改为:['a', 'b', 'c', 'd', 'e'] 有何办法? import pan ...

  6. 用 eric6 与 PyQt5 实现python的极速GUI编程(系列02)---- 省市县(区)下拉列表多级联动

    [概览] 本文实现如下的程序: 主要步骤如下: 1.在eric6中新建项目,新建窗体 2.(自动打开)进入PyQt5 Desinger,编辑图形界面,保存 3.回到eric 6,对上一步得到的界面文件 ...

  7. [CareerCup] 14.2 Try-catch-finally Java中的异常处理

    14.2 In Java, does the finally block get executed if we insert a return statement inside the try blo ...

  8. LeetCode:Remove Duplicates from Sorted List I II

    LeetCode:Remove Duplicates from Sorted List Given a sorted linked list, delete all duplicates such t ...

  9. [译]Python编写虚拟解释器

    使用Python编写虚拟机解释器 一.实验说明 1. 环境登录 无需密码自动登录,系统用户名shiyanlou,密码shiyanlou 2. 环境介绍 本实验环境采用带桌面的Ubuntu Linux环 ...

  10. C#出题库项目的总结(1)

    前记: 截止18点05分(4月9号),完成了代码部分的编写,明天争取把文档完成,毕竟在这个上面花的时间太多了,还有单词和书需要背,好吧,不说废话啦,下面进入正题. (PS:因为学院的模拟招聘笔试出题和 ...