Objective-C学习笔记(四):OC之分类、类对象、description方法和SEL
2016-03-01 21:09
405 查看
一、Category 分类
1.分类的创建
1>首先按照学习笔记(一)中的方法创建一个新的命令行项目
2>new file新建一个文件
3>选取OS X下Source中的Objective-C file
4>File Type选择Category,Class自己选择,并取名
5>创建成功
2.分类的形式为
@interface 类名 (分类名称)
@end
@implementation 类名 (分类名称)
@end
分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法。
分类使用注意:1>分类只能增加方法,不能增加成员变量
2>分类方法实现中可访问原来类中声明的成员变量
3>分类可以重新实现原来类中的方法,但会覆盖原来的方法,导致原来方法没法再用,故不推荐
4>方法调用的优先级:分类(最后参与编译的分类优先)>原来的类 >父类
二、类对象
类本身也是一个对象,是class类型的对象,简称类对象;我们利用类对象去创建类的对象。
获取类对象
Person *p=[Person alloc]init]; ---------------> Class c=[p Class];
Class c1=[Person Class]; ----> c,c1相同
三、description方法
1.默认情况下,利用NSLog和%@输出对象时,会调用description方法,并拿到返回值进行输出。
description方法有两种:+description(类方法)和-description(对象方法),+方法决定了类对象的输出结果,-方法决定了实例对象的输出结果。
2.我们来看一个例子,当你分别使用自定义的类创建对象和利用系统自带的类创建对象,然后利用NSLog和%@输出对象时,是不是会直接打印出对象中的所有内容
Person.h (Person.m我没有写东西)
main.m
运行结果
可以看到用自定义类的对象来输出时,输出的是一串没什么用的东西,其实他是descrption方法的默认输出形式:<类名:内存地址>。但是个东西的输出对我们来说并没有什么卵用,所有就要用到重写description方法来解决问题,让输出的结果更符合我们的要求。
现在在Person.m文件中重写了description方法:
Person.m
main.m
运行结果
另外要注意一点,这种写法是错误的,会造成死循环。因为你会不停地进入description方法。
四、SEL
对方法的调用除了直接调用,还有一种方式:利用SEL-------SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。
示例:
Person.m(看AddAge方法)
main.m
运行结果
1.分类的创建
1>首先按照学习笔记(一)中的方法创建一个新的命令行项目
2>new file新建一个文件
3>选取OS X下Source中的Objective-C file
4>File Type选择Category,Class自己选择,并取名
5>创建成功
2.分类的形式为
@interface 类名 (分类名称)
@end
@implementation 类名 (分类名称)
@end
分类的作用:在不改变原来类内容的基础上,可以为类增加一些方法。
分类使用注意:1>分类只能增加方法,不能增加成员变量
2>分类方法实现中可访问原来类中声明的成员变量
3>分类可以重新实现原来类中的方法,但会覆盖原来的方法,导致原来方法没法再用,故不推荐
4>方法调用的优先级:分类(最后参与编译的分类优先)>原来的类 >父类
二、类对象
类本身也是一个对象,是class类型的对象,简称类对象;我们利用类对象去创建类的对象。
获取类对象
Person *p=[Person alloc]init]; ---------------> Class c=[p Class];
Class c1=[Person Class]; ----> c,c1相同
三、description方法
1.默认情况下,利用NSLog和%@输出对象时,会调用description方法,并拿到返回值进行输出。
description方法有两种:+description(类方法)和-description(对象方法),+方法决定了类对象的输出结果,-方法决定了实例对象的输出结果。
2.我们来看一个例子,当你分别使用自定义的类创建对象和利用系统自带的类创建对象,然后利用NSLog和%@输出对象时,是不是会直接打印出对象中的所有内容
Person.h (Person.m我没有写东西)
main.m
运行结果
可以看到用自定义类的对象来输出时,输出的是一串没什么用的东西,其实他是descrption方法的默认输出形式:<类名:内存地址>。但是个东西的输出对我们来说并没有什么卵用,所有就要用到重写description方法来解决问题,让输出的结果更符合我们的要求。
现在在Person.m文件中重写了description方法:
Person.m
main.m
运行结果
另外要注意一点,这种写法是错误的,会造成死循环。因为你会不停地进入description方法。
四、SEL
对方法的调用除了直接调用,还有一种方式:利用SEL-------SEL就是对方法的一种包装。包装的SEL类型数据它对应相应的方法地址,找到方法地址就可以调用方法。在内存中每个类的方法都存储在类对象中,每个方法都有一个与之对应的SEL类型的数据,根据一个SEL数据就可以找到对应的方法地址,进而调用方法。
示例:
Person.m(看AddAge方法)
main.m
运行结果
相关文章推荐
- iOS学习笔记(2) - Objective-C基础
- C# 泛型之list<T>与ArrayList<object>比较
- 深入Objective-C的动态特性
- object-c 与 swift 混编
- object-c property关键字
- js object 对象 属性和方法的使用
- JsonObject、 jsonArray
- Objective-C学习笔记(三):OC之常用的OC语法下
- Objective-C学习笔记(二):OC之常用的OC语法上
- java中JSONObject与JSONArray的使用详细说明及有关JSON的工具类
- Object-C关联
- ObjectARX学习笔记
- 23.Instance Objects
- scala object隐式对象
- Objective-C学习笔记(一):OC之Hello World!
- Objective C - UIColor
- java.lang.Object.clone()分析
- libgdx [TiledMap Objects]
- Android属性动画(ObjectAnimation)
- C++ Super-FAQ 『Classes and Objects』