OC中SEL,类别,继承,协议的使用
1、SEL
SEL是selector的缩写,selector在OC中作用是定义一个方法变量,通过该方法变量来调用方法。我们在后面的UI中会经常用selector来调用事件方法。下面我将举两个例子来说明SEL的使用。
直接通过方法名来调用,我们先新建一个Student类,并在其中定义一个名叫Test的对象方法。并定义一个输出语句:
-(void)test
{
NSLog(@"这是SEL的测试方法");
}
我们在Main方法中通过SEL调用就会输出以上结果,如下:
SEL s = @selector(test);
[stu performSelector:s ];
但是有时候Test方法并非没有参数,当有参数时我们通常采用如下写法:
-(void)Introduce:(NSString *)name
{
NSLog(@"我是%@",name);
} Main方法中调用是的代码
SEL s = @selector(Introduce:);
[stu performSelector:s withObject:@"zhendiao"];
2.我们还可以通过字符串来调用与该字符串相关的方法,如
NSString * name = @"test";
Student * stu1 = [[Student alloc]init];
SEL s=NSSelectorFromString(name);
[stu1 performSelector:s];
这样同样可以调用到test方法。因此我们可以用字符串来传递方法名调用方法。
我们在后面的UI学习中会经常用到SEL,到时候相信会有更深层次的理解。 2、类别(catagory),类别是我们俗称为一种用来为某一类打补丁的方式,通常我们会通过类别为该类增加一些方法,我们也可以通过类别为系统类增加一些我们想要的方法 ,如我通过类别为NSNumber增加的add方法:
-(NSNumber *)add:(NSNumber *)num{
return [NSNumber numberWithInt:self.intValue + num.intValue];
}
这样就为NSNumber增加了一个add方法。新建类别的步骤:在项目文件右击选择new file,选择新建Objective -C file。在FileType中选择Catagory就行了。class选项即是你想增加类别的类。新建好后我们想要增加方法的类的后面便会有(add)类表明该方法属于哪个类别。类别我们在后面的开发中也经常会用到。
我们还可以通过类别为一个类的方法建立分类,我们简称为类簇,通过类簇我们将同一类方法放在一起。如:
@interface MySystem : NSObject -(void)m7;
-(void)m8;
-(void)m9;
@end // 某一类功能
@interface MySystem (category1)
-(void)m1;
-(void)m2;
-(void)m3;
@end // 第二类功能
@interface MySystem (category2)
-(void)m4;
-(void)m5;
-(void)m6;
@end
3、继承:子类会具有父类所有的属性(特征)和行为(方法)。
使用继承时我们会在子类后面加上冒号再加上父类表示继承
通过继承我们引申出了多态的含义:
多态:当以父类的引用去引用一个子类对象时候,如果子类重写了父类的方法,则会自动调用子类重写之后的方法。
当我们在使用继承时通常会用到super,self。那么这两个关键字有什么特殊含义呢。
self调用方法时是从当前类开始查找是否有对应方法,如果没有则去查找父类,直到找到该方法为止。
super是指从父类去查找是否有对应的方法,如果没有则查找父类的父类。
class方法存在于NSObject中,它返回的是对象所在的类的类名。OC中不存在重载,只能是重写父类的方法。
4、协议:协议即类似于java和.net中的接口,协议中通常会写入一些方法,供遵守协议的类实现。在Xcode中创建协议的方法和创建类别的方式jiben相同,在此不再赘述。在实现协议的时候我们通常在类名后面用尖括号将实现的协议括起来。下面粘贴一段实现持久化协议的代码仅供参考
类的声明部分
@interface Book : NSObject<NSCoding>
@property(nonatomic, copy) NSString * isbn;
@property(nonatomic, copy) NSString * name;
@property(nonatomic)NSString * num;
-(id)initWithIsbn:(NSString *)isbn andName:(NSString *)name andNum:(NSString *) num;
@end
类的实现部分@implementation Book
-(id)initWithIsbn:(NSString *)isbn andName:(NSString *)name andNum:(NSString *) num
{
self = [super init];
if (self) {
self.isbn = isbn;
self.name = name;
self.num = num;
}
return self; }
- (void)encodeWithCoder:(NSCoder *)aCoder{
[aCoder encodeObject:self.isbn forKey:@"isbn"];
[aCoder encodeObject:self.name forKey:@"name"];
[aCoder encodeObject:self.num forKey:@"num"];
} - (id)initWithCoder:(NSCoder *)aDecoder{
self = [super init];
if (self) {
self.isbn = [aDecoder decodeObjectForKey:@"isbn"];
self.name = [aDecoder decodeObjectForKey:@"name"];
self.num =[aDecoder decodeObjectForKey:@"num"];
}
return self;
}
OC中SEL,类别,继承,协议的使用的更多相关文章
- OC中的类别Category-协议Protocol-…
类别(category)--通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有&quo ...
- OC中的多继承
可以间接实现,方法有: 1.消息转发 2.协议 3.组合模式 4.代理 5.分类 直接上code,分别说明集中方法的实现 一.消息转发 消息转发可以参考我的另外一篇博客:http://www.cnbl ...
- OC中类别、扩展、协议与委托
一.类别(category) 类别(category)——通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法.(类别,接口部分的定义 ...
- OC中类别、扩展、协议与托付
类别(category)--通过使用类别,我们能够动态地为现有的类加入新方法.并且能够将类定义模块化地分不到多个相关文件里.通常仅仅在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有&qu ...
- 编译时和运行时、OC中对象的动态编译机制
编译时 编译时顾名思义就是正在编译的时候.那啥叫编译呢?就是编译器帮你把源代码翻译成机器能识别的代码.(当然只是一般意义上这么说,实际上可能只是翻译成某个中间状态的语言.比如Java只有JVM识别的字 ...
- OC中协议的概念以及用法
OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习 ...
- ios学习笔记(二)之Objective-C类、继承、类别和协议
二:Objective-C类与继承和协议 在前面已经提过了对象的初始化,这里首先讲的是变量. 2.1 变量 局部变量(内部变量): 局部变量是在方法内作定义说明的,其作用域仅限于方法内,离开方法后使用 ...
- OC学习7——类别、扩展和协议
1.我么在调用NSLog()方法打印一个对象时,实际上是调用了该对象的description方法,这个description方法就和Java中的toString()方法一样.所以,下面两行代码其实是一 ...
- java中的继承与oc中的继承的区别
为什么要使用继承? 继承的好处: (1)抽取出了重复的代码,使代码更加灵活 (2)建立了类和类之间的联系 继承的缺点: 耦合性太强 OC中的继承 1.OC中不允许子类和父类拥有相同名称的成员变量名:( ...
随机推荐
- 阶段1 语言基础+高级_1-3-Java语言高级_04-集合_08 Map集合_4_Map集合遍历键找值方式
键找值的方式 增强for 增强for的简化方式
- 测开之路一百零五:bootstrap的两种引用方式
一:下载到本地引用: 3.3.7版本:https://getbootstrap.com/docs/3.3/getting-started/#download 下载后解压到本地项目中引用 第二种,cdn ...
- jmeter之跨线程组共享cookies
jmeter在一个线程组里,可以把登录接口放在上面,再添加一个cookies管理器元件,这样下一个接口就可以携带登录信息.在不同线程组里其实也可以共享cookies 目录 1.方法 2.应用 1.方法 ...
- appium xpath元素定位
1.id定位 写法:driver.find_element_by_id("这里是resource-id") 2.name定位 name定位就是通过UI Automator工具查看的 ...
- 获取react中高阶组件方法
什么是高阶组件? 高阶组件就是接受一个组件作为参数并返回一个新组件的函数.这里需要注意高阶组件是一个函数,并不是组件,这一点一定要注意.同时这里强调一点高阶组件本身并不是 React API.它只是一 ...
- css练习-容器内多元素水平居中-flexbox布局应用
想要实现这样一个父元素中的子元素都是居中的 只需在父元素上加样式 {display: flex;flex-direction: column;align-items:center;} 设置为flexb ...
- 使用pyautogui替代selenium,图像识别进行web自动化测试--基于python语言
这里演示一下使用pyautogui替代selenium进行web自动化测试,并不建议使用pyautogui进行web自动化测试,因为元素的ui一旦有长宽变化,或者风格的变化,执行时就会发生异常,仅当学 ...
- HIbernate入门3
HIbernate的一对多操作: 1. 创建实体类:一个Customer类(客户类)和一个LinkMan类(联系人),两者的关系为:一个客户中可能有多个联系人(关于一对多的实体类之间的关联,不做详细介 ...
- 《剑指offer》面试题20 顺时针打印矩阵 Java版
我的方法:遇到这种题最好在纸上画一画打印路线.我利用了4个标志left.top.right.bottom,表示当前需要打印的左界.上届.右界和下界,换句话说这些界线之外的已经打印了,如此一来判断结束的 ...
- [常用类]String 类
String 字符串是常量,一旦被赋值,就不能被更改. String str = “abc”: // "abc" 可以堪称是一个字符串对象 str = “def“: // 当把 & ...