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;
}
时间: 2024-10-12 11:09:51

OC中SEL,类别,继承,协议的使用的相关文章

OC中的类别Category-协议Protocol-… - 韩俊强的博客 - 博客频道 - CSDN.NET

OC中的类别Category-协议Protocol- 类别(category)--通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有"类+类别名.h" @interface 已有类 (类别名) //.......方法实现 @end #import #import "Buy.h" @interface Person : NSObject <<s

OC中类别、扩展、协议与委托

类别(category)--通过使用类别,我们可以动态地为现有的类添加新方法,而且可以将类定义模块化地分不到多个相关文件中.通常只在类别中定义方法. 类别,接口部分的定义,通常该文件命名为已有"类+类别名.h" @interface 已有类 (类别名) //.......方法实现 @end 例如,考虑为NSNumber增加一个类别,则接口部分代码如下 <p style="margin-top: 0px; margin-bottom: 0px; font-family:

OC中通过协议实现多继承

在OC中并没有多继承的概念, 但是我们可以通过协议来实现多继承 实例如下: #import <Foundation/Foundation.h> @protocol Add <NSObject> - (int)addA:(int)a b:(int)b; @end #import <Foundation/Foundation.h> @protocol Sub <NSObject> - (int)subA:(int)a b:(int)b; @end #import

OC中协议的概念以及用法

OC中协议的概念以及用法,协议也是OC中的一个重点,Foundation框架以及我们后面在写代码都会用到. OC中的协议就是相当于Java中的接口(抽象类),只不过OC中的名字更形象点,因为我们在学习Java中的接口时候,看可以知道其实接口就相当于一种契约(协议),给他的实现类打上标记了,当然这个活在Java5.0之后,被注解替代了,因为注解就是为了此功能诞生的.协议就是定义了一组方法,然后让其他类去实现 下面来看代码:WithProtocol.h[objc]  view plaincopy 

OC中协议, 类目, 时间, 延展, 属性

必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @property (nonatomic, assign) id<marryprotocol> husband; 避免Optitonal没有实现的功能 if ([_husband respondsToSelector:@selector(driver)]) { [_husband driver]; } @required//必须实现的协议, 默认协议 - (void)s

黑马程序员------OC中协议和分类

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- OC中没有想C++中的多继承,是利用分类和协议来实现的. 分类是在不影响原有存在类的基础上,为原有类添加属性和方法. 协议:一般只是声明方法.遵守了协议的类,才会去实现协议中的方法. 协议一般和代理的一起使用.分类,一般是为系统中的类添加

oc中分类 扩展 协议的使用及区别

一.分类 1.适用范围 当你已经封装好了一个类(也可能是系统类.第三方库),不想在改动这个类了,可是随着程序功能的增加需要在类中增加一个方法,这时我们不必修改主类,只需要给你原来的类增加一个分类. 将一个大型的类拆分成不同的分类,在不同分类中实现类别声明的方法,这样可以将一个类的实现写到多个.m文件中,方便管理和协同开发. 分类中的方法可以只声明,不实现,所以在协议不支持可选方法的时候(协议现在已经支持可选方法),通常把分类作为非正式协议使用. 2.语法格式 文件中的语法 @interface

OC中protocol、category和继承的区别

利用继承,多态是一个很好的保持"对扩展开放.对更改封闭"(OCP)的办法,也是最常见的一种方法.Objective C还支持另外两种语法来支持OCP:Protocol和Category.Protocol只能定义一套接口,而不能提供实现,变相的也是一种Abstract class的实现方式(oc 语法上本身不支持抽象基类).Category可以为类提供额外的接口和实现.那么到底三者(继承, Protocol,Category)在使用上到底有什么本质的区别呢?在我看来,protocol的作

iOS开发OC基础:OC中的协议

1.协议是一种为有源代码的类扩充方法的方式. 2.协议只是一系列方法的生命,就相当于一张任务清单,规定了要做的事情,但是具有的实施(也就是实现),是由服从该协议的类来实现.所以协议只有.h文件,并且不可以定义变量 3.协议的定义是以@protocol开头, + 协议的名字 <>(表示服从的协议)服从的协议写在<>之内,多个协议之间通过逗号来进行分隔,父协议中的内容就相当于子协议也具有这些内容,以@end结束. 下面的附件是协议的一个小例子,可以加深大家对协议的理解,看完之后一定要多