IOS基础之 (七) 分类Category
一 Category
分类:Category(类目,类别) (OC有)
命名:原来的类+类别名(原来的类名自动生成,只要写后面的类别名,一般以模块名为名。比如原来类 Person,新建分类 Ct,新建的分类名为 Person+Ct )
作用: 在不改变原来类的内容的情况下,可以给原来的类添加一些新的方法。
注意:
1)分类只能增加方法,不能增加成员变量。
2)分类方法的实现中,可以访问原来类中的成员变量。
3)分类可以重写原来类的方法。但是会覆盖原来类的方法(一般不会再分类当中重写原来类的方法)。
4)调用优先级:分类优先(最后参与编译的分类会优先调用)。
1. 创建一个OC类
New File -> iOS -> CoCoa Touch Class ,新建一个类 Person
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; - (void) showInfo; @end
Person.m
#import "Person.h"
@implementation Person
- (void)showInfo{
NSLog(@"人的年龄是%d", _age);
}
@end
2. 新建一个分类
New File -> iOS -> CoCoa Touch Class ,新建一个分类 Ct1 ,File Type选择 Category ,Class 填为 Person (表示的是Person类的分类)
Person+Ct1.h
#import "Person.h" @interface Person (Ct1) - (void) run; @end
Person+Ct1.m
#import "Person+Ct1.h"
@implementation Person (Ct1)
- (void)run{
NSLog(@"调用了 run()方法");
}
@end
3.测试
main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Person+Ct1.h" int main(int argc, const char * argv[]) {
Person *p = [[Person alloc]init];
p.age = ;
[p showInfo];
[p run]; return ;
}
第2行: 导入Person类的头文件。
第3行:导入Person的分类头文件。
第9行是:person 对象调用的分类方法 run。
二 类的本质
1.类的本质是类本身也是一个对象,是个Class类型对象,简称类对象。
利用Class创建Person类对象。
利用Person类对象 ,创建Person类型的对象。
1.1获取内存中的类对象
Class c =[p class];
Class c2 =[p2 class];
1.2获取内存中的类对象
Class c3 = [Person class]
当程序启动时,就会加载一次项目中所有的类。类加载完之后,就会调用这个+load方法。(分类,本身类程序启动时都会调用,)
必须使用类,当类第一次使用时调用,就会调用 + initialize方法。(分类,本身类,有分类只会调用分类)
先加载父类的,在加载子类的(先调用父类的 +load,在调用子类的 +load )
先调用父类的初始化方法,在调用子类的初始化方法( + initialize)。
面试题:监听什么时候调用这个类,使用的方法。
+ (void) initialize{
}
三 description
重写对象的字符串输出。
四 SEL
SEL:全称Selector 表示方法的存储位置
Person *p=[[Person alloc] init];
[p test];
寻找方法的过程:
(1)首先把test这个方法名包装成sel类型的数据;
(2)根据SEL数据找到对应的方法地址;
(3)根据方法地址调用相应的方法。
(4)注意:在这个操作过程中有缓存,第一次找的时候是一个一个的找,非常耗性能,之后再用到的时候就直接使用。
注意:SEL其实是对方法的一种包装,将方法包装成一个SEL类型的数据,去寻找对应的方法地址,找到方法地址后就可以调用方法。这些都是运行时特性,发消息就是发送SEL,然后根据SEL找到地址,调用方法。
Person.h
#import <Foundation/Foundation.h> @interface Person : NSObject @property NSString *name;
@property int age; - (void) run;
- (void) showAge:(int)age WithName:(NSString *)name ;
Person.m
#import "Person.h"
@implementation Person
- (void)run{
NSLog(@"名字是%@,年龄是%d的人正在跑步。", _name, _age);
}
- (void)showAge:(int)age WithName:(NSString *)name{
NSLog(@"age=%@,name=%@",age,name);
}
@end
测试 @selector
Person *p = [[Person alloc]init];
p.name = @"wangwu";
p.age = ; NSObject *age1 = @;
id age2 = @;
[p performSelector: @selector(showAge:WithName:) withObject: age1 withObject: @"lisi" ];
五 NSLog
Person *p1= [Person alloc];
//<类名: 内存地址>
NSLog(@"%@", p1);
// 指针变量的地址
NSLog(@"%p", p1);
//打印对象的地址
NSLog(@"%p", &p1);
//输出行号
NSLog(@"%d" , __LINE__ );
//输出C语言中的字符串,不能有中文
NSLog(@"%s" , __FILE__);
//输出C语言中的字符串,可以有有中文
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的更多相关文章
- 关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol
关于ios object-c 类别-分类 category 的静态方法与私有变量,协议 protocol 2014-02-18 19:57 315人阅读 评论(0) 收藏 举报 1.category, ...
- iOS之分类(category)
1.分类(category)的作用 1.1作用:可以在不修改原来类的基础上,为一个类扩展方法.1.2最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? 2.1分类中只能添加“方法”,不能增加 ...
- iOS中 分类(category)与扩展(Extension)的区别?
1.分类(category)的作用 (1).作用:可以在不修改原来类的基础上,为一个类扩展方法.(2).最主要的用法:给系统自带的类扩展方法. 2.分类中能写点啥? (1).分类中只能添加“方法”,不 ...
- 从C#到Objective-C,循序渐进学习苹果开发(3)--分类(category)和协议Protocal的理解
本随笔系列主要介绍从一个Windows平台从事C#开发到Mac平台苹果开发的一系列感想和体验历程,本系列文章是在起步阶段逐步积累的,希望带给大家更好,更真实的转换历程体验.本文继续上一篇随笔<从 ...
- 分类(Category)的本质 及其与类扩展(Extension) /继承(Inherit)的区别
1.分类的概念 分类是为了扩展系统类的方法而产生的一种方式,其作用就是在不修改原有类的基础上,为一个类扩展方法,最主要的是可以给系统类扩展我们自己定义的方法. 如何创建一个分类?↓↓ ()Cmd+N, ...
- OC的特有语法-分类Category、 类的本质、description方法、SEL、NSLog输出增强、点语法、变量作用域、@property @synthesize关键字、Id、OC语言构造方法
一. 分类-Category 1. 基本用途:Category 分类是OC特有的语言,依赖于类. ➢ 如何在不改变原来类模型的前提下,给类扩充一些方法?有2种方式 ● 继承 ● 分类(Categor ...
- Objective-C:继承、分类(Category、extension)、协议(protocol),个人理解,仅供参考
总结:继承.分类(Category.extension).协议(protocol) 一.继承: (1)特点: 继承多用于一般父类中的方法功能比较齐全,子类从父类继承过来使用,可以省略很多重复的代码 ...
- iOS基础UI控件介绍-Swift版
iOS基础UI控件总结 iOS基础控件包括以下几类: 1.继承自NSObject:(暂列为控件) UIColor //颜色 UIImage //图像 2.继承自UIView: 只能相应手势UIGest ...
- IOS基础学习-2: UIButton
IOS基础学习-2: UIButton UIButton是一个标准的UIControl控件,UIKit提供了一组控件:UISwitch开关.UIButton按钮.UISegmentedContro ...
随机推荐
- Ember模板中的操作指向
模板中的链接操作指向有三个地方,该模板对应的控制器和路由以及视图,默认是先跳转到控制器,如果控制器里没有定义模板中动作的方法,就去该模板对应的路由里找,如果还没找到,就去父级路由找,直到顶级路由,如果 ...
- 关于Java多态
什么是多态 同一个实现接口,使用不同的实例而执行不同的操作 子类转换成父类的规则: *将一个父类的引用指向一个子类对象时,称为上转型,自动进行类型转换 *此时通过父类引用变量调用的方法是子类覆盖或继承 ...
- FusionCharts V3图表导出图片和PDF属性说明(转)
百闻不如一见,狠狠点击,快快下载:(演示文档有错误,不提供下载了.待新的演示文档出来.) 许多朋友说上面的DEMO用不了.fusioncharts官方的演示非常不错,就是来不及整理,各位大侠们可以研究 ...
- win server 2008配置ftp无法登陆问题的解决办法
解决办法放在最前面,方便急需答案的同学: 创建了ftp使用的windows账户后,一定要给该账户添加ftp目录的权限,如下图所示,为新账户添加权限后(且设置了“ftp身份验证”),即可正常访问ftp: ...
- 如何在Web服务器80端口上开启SSH服务
本文所讨论的网络端口复用并非指网络编程中采用SO_REUSEADDR选项的 Socket Bind 复用.它更像是一个带特定路由功能的端口转发工具,在应用层实现. 背景 笔者所处网络中防火墙只开放了一 ...
- 信息安全系统设计基础实验一 20135210&20135218
北京电子科技学院(BESTI) 实 验 报 告 课程: 密码系统设计基础 ...
- 20135316王剑桥 linux第五周课实验笔记
4.1.1程序员的可见的状态 ———— Y86的每条指令都会读取或修改处理器状态的某些部分,称为程序员可见状态.如图1所示. 1.程序寄存器(Program registers): %eax, %ec ...
- iOS中几种定时器
在软件开发过程中,我们常常需要在某个时间后执行某个方法,或者是按照某个周期一直执行某个方法.在这个时候,我们就需要用到定时器. iOS中定时器NSTimer的使用 1.初始化 + (NSTimer ...
- VC++中复制对话框资源 之较好方法之一
资源对话框的编写有时候较为麻烦,这里我成功实现了这个方法的可用性,具体如下: 碰到模块移植问题了,自己做的对话框类(继承于CDialog)要移植到目标工程中.在网上搜了几个帖子发现都说的很生涩. ...
- 安装.NET CORE
需要安装两个包 https://github.com/dotnet/cli 1. .NET Core Installer 2. .NET Core SDK Installer