1、分类 - Category

 1> 基本用途

  分类:可以给某个类扩充一些方法(不修改原来的代码)  

  如何在不改变原来类模型的前提下,给类扩充一些方法?

  有2种方式: 继承; 分类(Categoty)。

 2> 格式

  分类的声明

  @interface 类名(分类名称)
   // 方法声明
    @end

  分类的声明

  @implementation 类名(分类名称)
   // 方法声明
    @end

 3> Category在 Xcode 7.2 创建方法

  New File -> Objective-C File -> File为分类名,File Type选Category,class为创建分类的类

  分类名一般以模块名命名

 4> 好处

  当一个类特别庞大,并且具有不同的功能,我们可以一个功能写在一个分类中,更有利于团队开发。

 5> 使用注意

  • 分类只能增加方法,不能增加成员变量
  • 分类方法实现中可以访问原来类中的成员变量
  • 分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
  • 分类的优先级最高,方法调用时,优先到分类中查找,然后再去原来类中查找,最后再去父类中找
  • 多个Category中如果实现了相同的方法,只有最后一个参与编译的才会有效
  • 查看编译顺序:点击工程名,build phases -> Compiles Sources

2、类的本质

 1> 类也是个对象

  其实类也是一个对象,是 Class 类型的对象,简称 "类对象"

  Class 类型的定义

   typedef struct objc_class *Class

  类名就代表着类对象,每个类只有一个类对象

 2> +load 和 +initialize

  ① +load

  • 当程序启动的时候会加载所有的类和分类,并调用所有的类和分类的 +load 方法
  • 先加载父类,再加载子类;也就是先调用父类的 +load ,再调用子类的 +load
  • 先加载原始类,再加载分类
  • 不管程序运行过程有没有用这个类,都会调用 +load 方法

  ② +initialize

  • 在第一次使用某个类时(比如创建对象等),就会调用一次 +initialize 方法
  • 一个类只会调用一次 +initialize 方法,先调用父类的,再调用子类的

 3> 获取类对象的2种方式

  Class c = [Person class]; // 类方法

  或者

  Person *p = [Person new];

  Class c2 = [p class]; // 对象方法

 4> 类对象调用类方法  

  Class c = [Person class];

  Person *p2 = [c new];

3、description 方法

 1> -description 方法

  使用NSLog和%@输出某个对象时,会调用对象的 -description 方法

  -description 决定了实例对象的输出结果,默认情况下,结果是:<类名:内存地址>

 2> +description 方法

  使用NSLog和%@输出某个类对象时,会调用对象的+description 方法

  +description决定了类对象的输出结果,默认情况下,结果是:类名

 3> 修改 NSLog 的默认输出

  重写 -description 或者 +description 方法即可

 4> 死循环陷阱

  如果在 -description 方法中使用 NSLog 打印 self

 5> NSLog打印增强

         Person *p = [[Person alloc] init];

         // 指针变量地址
NSLog(@"%p", &p);
// 对象的地址
NSLog(@"%p", p);
// <类名:对象地址>
NSLog(@"%@", p);
// 输出代码所在行数
NSLog(@"%d", __LINE__); // 输出源文件的路径
// NSLog输出C语言字符串的时候,不能有中文
// NSLog(@"%s", __FILE__);
printf("%s\n", __FILE__); // 输出当前函数名
NSLog(@"%s", __func__);

4、SEL

 1> 方法的存储位置

  每个方法都有一个与之对应的SEL类型的对象

  根据一个SEL对象就可以找到方法的地址,进而调用方法

  SEL类型的定义

   typedef struct objc_selector *SEL;

 2> SEL对象的创建

SEL sel = @selector(test);
SEL s = NSSelectorFromString(@"test"); // NSSelectorFromString将字符串转为SEL类型的数据

 3> SEL对象的其他用法

  将SEL对象转为NSString对象

// 将SEL对象转为NSString对象
NSString *str = NSStringFromSelector(@selector(test));

  间接调用方法(performSelector: SEL)

         // 间接调用对象p的方法
// 不带参数的方法
SEL sel = @selector(test2);
[p performSelector:@selector(test2)]; // 带参数的方法
[p test3:@"abc"];
[p performSelector:@selector(test3:) withObject:@"a456"];

 4> _cmd

  _cmd 代表着当前方法

 - (void)test2 {

     // _cmd 代表着当前方法
NSString *str = NSStringFromSelector(_cmd); // 会造成死循环
// [self performSelector:_cmd]; NSLog(@"test2----%@", str);
}

iOS之09-特有语法的更多相关文章

  1. OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数

    1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如 ...

  2. <2013 08 09> __attribute__是GCC编译器特有语法

    1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关,g ...

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

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

  4. iOS入门及ObjC语法

    iOS入门:http://www.jonathanhui.com/ios ObjC语法: http://www.jonathanhui.com/objective-c https://github.c ...

  5. iOS之08-核心语法

    1.点语法 点语法( . )的本质还是方法调用, java中的点是访问成员变量, 在OC中直接访问成员变量的方式只有 -> p.age = ; // [p setAge:10] int a = ...

  6. iOS之01-基本语法

    视频iOS是本人通过视频学习,初期并不是直接使用Xcode,而是在命令行下创建文件.打开文件.编译文件和运行文件. #import <Foundation/Foundation.h> in ...

  7. ios中XPath的语法

    在XML的读写中,我们知道有Xpath的语法 1.定位节点:(/)代表绝对的路径,代表起始地位置.(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来 2.KissX ...

  8. OC特有语法-分类(category)

    本文转载Keefo. Objective-C的Object-oriented programming特性提供subclass和category这2个比较非常重要的部分.subclass应该反复被各种编 ...

  9. oc特有语法

    分类 问题 1.什么是分类? 就是把一个类的功能,分出一部分来放在一个独立的文件中 2.分类的语法是什么样的? @interface Person(SuperMan) 3.分类与类是什么关系? 分类依 ...

  10. iOS使用sqlite3原生语法进行增删改查以及FMDB的使用

    首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去. 一种方法是从外面拷贝到程序里:http://www ...

随机推荐

  1. Linux Shell常用快捷键

    ctrl+a[A]:将光标移到命令行开头 ctrl+e[E]:将光标移到命令行结尾 ctrl+c[C]:强制终止命令执行 ctrl+u[U]:删除/剪切光标之前的所有字符 ctrl+y[Y]:粘贴ct ...

  2. Java RSA 密钥生成工具

    MAC openssl: RSA加解密 第一条命令是生成密钥长度为1024的密钥: 第二条命令是从中生成公钥: 第三条命令是使用pkcs8编码密钥为私钥 http://blog.csdn.net/ch ...

  3. Mysql控制语句

    14.6.5.1 CASE Syntax 14.6.5.2 IF Syntax 14.6.5.3 ITERATE Syntax 14.6.5.4 LEAVE Syntax 14.6.5.5 LOOP ...

  4. sqlserver 连接远程数据库小结

    A,B两个数据库,不在同一台服务器实例 当需要通过sqlserver语句来实现对远程数据库操作(OPENDATASOURCE): select * from -- 操作类型 OPENDATASOURC ...

  5. Java -- File

    @.getPath().getAbsolutePath().getCanonicalPath()区别 原文:http://blog.csdn.net/wh_19910525/article/detai ...

  6. 【Java EE 学习 19】【使用过滤器实现全站压缩】【使用ThreadLocal模式解决跨DAO事务回滚问题】

    一.使用过滤器实现全站压缩 1.目标:对网站的所有JSP页面进行页面压缩,减少用户流量的使用.但是对图片和视频不进行压缩,因为图片和视频的压缩率很小,而且处理所需要的服务器资源很大. 2.实现原理: ...

  7. ZLL主机接口的信息处理流程

    主机接口的信息处理流程 在我们翻译的文档中是用电脑端来模拟主机的,电脑代替网关发送主机接口命令的环节是在zll_controller.c中实现的,(在下载的文件中已经提供了其对应的可执行文件zllCm ...

  8. Unity3D项目开发一点经验

    我们主要使用3dsmax2010进行制作,输出FBX的类型导入Unity3D中.默认情况下,3dsmax8可以和U3D软件直接融合,自动转换为FBX物体. 注意事项如下: 1.面数控制 在MAX软件中 ...

  9. ML 06、感知机

    机器学习算法 原理.实现与实践  —— 感知机 感知机(perceptron)是二分类的线性分类模型,输入为特征向量,输出为实例的类别,取值+1和-1.感知机学习旨在求出将训练数据进行线性划分的分离超 ...

  10. 用PHP链接mysql数据库

    PHP提供了两套数据库可用于访问mysql数据库 1)MySQL扩展函数数据库 2)MySQLI扩展数据库(improved) 使用MySQLI函数访问MySQL数据库步骤 1)链接数据库管理系统 m ...