iOS之09-特有语法
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-特有语法的更多相关文章
- OC特有语法:分类category,给NSString增加方法计算字符串中数字的个数
1:分类的使用场景:想对一个类,扩充一些功能,而又不改变原来类的模型,也不用继承,这时OC中的特有语法:分类可以做到: 当然分类也是一个类,也需要声明和实现,声明在.h文件中,实现在.m文件中,格式如 ...
- <2013 08 09> __attribute__是GCC编译器特有语法
1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关,g ...
- OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法
一. 分类-Category 1. 基本用途:Category 分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...
- iOS入门及ObjC语法
iOS入门:http://www.jonathanhui.com/ios ObjC语法: http://www.jonathanhui.com/objective-c https://github.c ...
- iOS之08-核心语法
1.点语法 点语法( . )的本质还是方法调用, java中的点是访问成员变量, 在OC中直接访问成员变量的方式只有 -> p.age = ; // [p setAge:10] int a = ...
- iOS之01-基本语法
视频iOS是本人通过视频学习,初期并不是直接使用Xcode,而是在命令行下创建文件.打开文件.编译文件和运行文件. #import <Foundation/Foundation.h> in ...
- ios中XPath的语法
在XML的读写中,我们知道有Xpath的语法 1.定位节点:(/)代表绝对的路径,代表起始地位置.(//)表示文件中所有符合模式的元素都会被选出来,即使是处于树中不同的层级也会被选出来 2.KissX ...
- OC特有语法-分类(category)
本文转载Keefo. Objective-C的Object-oriented programming特性提供subclass和category这2个比较非常重要的部分.subclass应该反复被各种编 ...
- oc特有语法
分类 问题 1.什么是分类? 就是把一个类的功能,分出一部分来放在一个独立的文件中 2.分类的语法是什么样的? @interface Person(SuperMan) 3.分类与类是什么关系? 分类依 ...
- iOS使用sqlite3原生语法进行增删改查以及FMDB的使用
首先要导入libsqlite3.dylib并且加入头文件#import <sqlite3.h>,在进行增删改查之前还要先把数据库搞进去. 一种方法是从外面拷贝到程序里:http://www ...
随机推荐
- iOS开发如何学习前端
原文链接 前端大概三大块. HTML CSS JavaScript 基本上每个概念在iOS中都有对应的.HTML请想象成只能拉Autolayout或者设置Frame的ViewController.好比 ...
- Swift - 键盘弹出样式
Swift提供了11种键盘类型: 在开发中,我们可以根据不同的需求,选择不同的键盘样式,例如,当我们只需要输入手机号码时,可以选择纯数字类型的键盘(.NumbersAndPunctuation),当我 ...
- 使用xib需要记得的小问题
1. 图片 加载 图片上的label 不显示, 最后是因为xib 里位置动了 图片跑到最上层盖住了labe 2. 加载xib 有时候会崩 或加载不出来 先查看xib 是否有多余控件 3. 查看关联 ...
- JVM内存区域与内存溢出异常
Java虚拟机在执行java程序时会把它所管理的内存会分为若干个不同的数据区域,不同的区域在内存不足时会抛出不同的异常. >>运行时数据区域的划分 (1)程序计数器程序计数器(Progra ...
- Spell checker
Spell checker Time Limit:2000MS Memory Limit:65536KB 64bit IO Format:%I64d & %I64u Subm ...
- jq与js 区别
$(this).html(666); <div id="a">123</div> <script> $("#a").clic ...
- ASP.NET 5探险(6):升级ASP.NET 5到beta6
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 题记:微软根据ASP.NET 5的路线图如期发布了beta6,现在我们就来说说beta5升级 ...
- zzy:请求静态资源和请求动态资源, src再次请求服务器资源
[总结可以发起请求的阶段:请求动态资源:通过web.xml匹配action然后,自定义Servlet处理该action1)form表单提交请求的时候,用action设定,该页面发起请求的Servlet ...
- hibernate 关联映射
关联关系大致分为两大类: 1.单向关系:只需单向访问关联端.例如:只能通过老师访问学生,或者只能通过学生访问老师. 2.双向关系:关联的两端可以互相访问.例如:老师和学生之间可以互相访问. 单向关联可 ...
- 如何设计一个优秀的API(转)
到目前为止,已经负责API接近两年了,这两年中发现现有的API存在的问题越来越多,但很多API一旦发布后就不再能修改了,即时升级和维护是必须的.一旦API发生变化,就可能对相关的调用者带来巨大的代价, ...