转载

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; } 
正文到此结束
Loading...