OC-类目延展协议

类目(Category)

延展(Extension)

协议(Protocol)

一.类目

OC语言中的类目机制只有一个作用:为任何一个类添加方法

注意:

1.不能在分类中添加属性,只能添加方法

2.如果再分类里面使用@property,那么它只能生成getter和setter的声明,没有实现

3.如在在分类中写了与本类同名的方法,优先调用分类里面的方法,所以在分类中定义类的时候,尽量避免和本类中的方法重名

4.在分类里面可以访问本类里面所定义的属性

我们为NSString类添加一个方法,实现字符串的翻转,NSString中没有实现字符串翻转的方法,所以类目就很重要了

代码如下:

#import <Foundation/Foundation.h>

@interface NSString (Overturn)

-(NSString *)overturn;

@end

#import "NSString+Overturn.h"

@implementation NSString (Overturn)

//实现字符串的翻转

-(NSString *)overturn

{

NSMutableString *str=[NSMutableString string];

for(int i = (int)self.length; i >=0; i--)

{

char c = [self characterAtIndex:i-1];

[str appendFormat:@"%c",c];

}

return str;

}

@end

#import <Foundation/Foundation.h>

#import "NSString+Overturn.h"

#import "NSString+Cate.h"

int main(int argc, const char * argv[]) {

@autoreleasepool {

NSString *[email protected]"abcd";

NSString *str1=[str overturn];

NSLog(@"%@",str1);

NSNumber *num=[str lengthAsString];

NSLog(@"%@",num);

}

return 0;

}

二,延展

延展可以看作是一种匿名的类目,类有时需要一些只为自己所见,所用的私有方法这种私有方法可以通过延展的方式来声明。

为类创建了私有方法,实现一对多

1个.m对应多个.h文件

就是说一个类的 .m文件可以有多个延展的.h文件

延展可以进行成员变量,属性,方法的各种操作

延展文件MyClass_add.h

#import "MyClass.h"

@interface MyClass ()
-(void)add;

@end

类文件:Myclass.h

#import <Foundation/Foundation.h>

@interface MyClass : NSObject
-(void)select;

@end

Myclass.m

#import "MyClass.h"
@implementation MyClass
-(void)select{
    NSLog(@"%s",__func__);
}
-(void)add{
    NSLog(@"%s",__func__);
}

@end

主函数 main.m

#import <Foundation/Foundation.h>

#import "MyClass.h"

//到导入延展的头文件

#import "MyClass_add.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        MyClass *class=[[MyClass alloc]init];
        [class select];
        [class add];
   
    }
    return 0;

}

三.协议

OC中的协议为一组方法的声明。不需要实现。遵守协议的类负责实现协议中的方法。

协议使用@protocol关键字进行声明。

其声明的方法中分为必须实现的方法和可选实现的方法。分别用@required@optional关键字标示。

如果不写默认为必须实现的方法

协议只有方法的声明(类似于其他编程语言的接口)

协议相当于大家都所遵循的

关键字 @protocol 协议名 <所遵循的协议> 默认NSObject

@end

@protocol lamcoProtocol <NSObject>
@required  //必须实现的方法
-(void)study;

@optional  //可实现可不实现的方法
-(void)work;

@end

student.h文件

#import <Foundation/Foundation.h>

#import "lamcoProtocol.h"

@interface Studeny : NSObject<lamcoProtocol,bank>

@end

student.m文件

#import "Studeny.h"
@implementation Studeny
-(void)study{
    NSLog(@"%s",__func__);
}
//-(void)work{
//    NSLog(@"%s",__func__);

//}

@end

主函数:

#import <Foundation/Foundation.h>
#import "Studeny.h"

#import "OtherStudent.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        Studeny *stu=[[Studeny alloc]init];
       
//        [stu study];

//判断其是否遵循协议

if ([stu conformsToProtocol:@protocol(lamcoProtocol)]) {
            //判断协议是否有该方法
            if([stu respondsToSelector:@selector(study)]){
                [stu study];
//                [stu work];
            }else{
                NSLog(@"找不到好工作");
            }
        }else{
            NSLog(@"没有参加培训");
        }
       
        if([stu conformsToProtocol:@protocol(lamcoProtocol)]){
            if ([stu respondsToSelector:@selector(giveMoney)]) {
                NSLog(@"每月还钱");
            }else{
                NSLog(@"成为黑户");
            }
        }else{
            NSLog(@"不关事");
        }
       
       
       
    }
    return 0;

}

时间: 2024-08-03 12:34:31

OC-类目延展协议的相关文章

类目 延展 协议

1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. 首先先建个类目 command+n 给什么类写类目下面就写那个类的名字 上面填的是给这个类添加的方法的名字 @interface NSMutableArray (Sort) //为NSMutableArray类添加Sort方法,Sort就是类目名,做到见名知意-(void)invert;//方法@end 实现部分 #import "NSMutableA

OC -- 类的类目 , 延展 , 协议

类目 分两部分: 1.系统已经写好的类目:按照功能对系统的类方法进行区分. 类目从@interface开始,后面是当前类名字,类名后是分类的功能, 到@end结束. 2.我们创建的类目,一般是为了把系统的类进行扩充. 对系统的类(例:NSString)添加文件Objective-C File {File:StringMethod; File Type:Category; Class: NSString}后,会自动出现@interface NSString (StringMethod).文件名为:

OC 类目、协议

类目:为现有的类添加新方法 1.需要添加该类的新方法,但是不能继承该类的情况下 类目使用需要注意的问题: 1.类目里面不能添加实例变量,但是类目可以声明属性,但必须实现set get 方法,在这两个实现方法里面依然不能使用自己添加的实例方法 2.类目里添加的方法不能和原类中的方法重名,否则会导致覆盖 3.一个类可以添加多个类目,但是类目名和方法名不能重复 4.类目中的方法可以成为原始类的一部分,和原始类方法级别相同,可以被子类继承 类目的创建与使用: File:是类目的名称 File Type:

[objective-c] 03 - 类目 延展 协议

本章主要讲解OC语言特性 类目(Category) 延展(Extension) 协议(Protocol) 1.类目 OC语言中的类目机制只有一个作用:为任何一个类添加方法 现在我们创建一个Student类 @interface Student : NSObject @property(nonatomic,strong)NSString * name; @end @implementation @end 如果想为Student类添加一个方法,现在有两种方法 直接修改Student类的源码,声明一个

类目,延展,协议的基本概念

Catgory(类目/分类) 1.分类是给原有类添加方法,它只能添加方法,不能添加属性(成员变量) 2.分类中定义@property,只会生成setter/getter方法的声明,没有方法的实现以及私有变量. 3.分类中的方法不能和本类的方法名相同,否则会有警告,而且调用的时候会优先调用分类的方法,即覆盖本类的方法. 4.分类的方法和实现分开,一对多,1个.h文件对应多个.m文件,典型的分散实现: 延展(Extension) 1.延展为类创建私有方法,一个.m文件对应多个.h文件,分配权限时可以

【objective-c】类目 延展 协议

1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. Category的使用场景有那些呢:1.类包含了很多个方法实现,而这些方法需要不同团队的成员来实现2.当你在使用基础类库中的类时,你不想继承这些类而只想添加一些方法时. Category能实现上面的需求,当然也有使用Category是需要注意的问题: 1.Category可以访问原始类的实例变量,但不能添加实例变量,如果想添加变量,那就通过继承创建子类

Objective-C类目延展协议

一.类目:(Category) 是在原有类的基础之上添加方法,在使用的时候只需要用原有类实例化出来的对象即可: 实际开发中什么情况下使用类目? 已经封装好的类,(不希望再改变原有类) 团队里面分工开发一个模块的时候可以使用自己定义的方法: 二.延展:(Extension)的基本概念和用法: 在xcode4.3之前直接使用self 调用方法  那时候会报错,所以的用延展 就是在类中添加私有方法,延展中声明的方法在类的本身的@interface  类名()和它对应的@end之间实现: 类有时需要方法

OC 类目(category) 延展(extension) 协议(protocol)(摘抄)

Objective-c中提供了可以让我们扩展类定义的手段:类目,延展和协议.类目:为已知的类增加新的方法:延展:通知在本类的定义里使用类目来声明私有方法:协议:协议声明了可以被任何类实现的方法. 注意:这些手段只能增加类的方法,并不能用于增加实例变量,要增加类的实例变量,只能通过定义子类来间接实现. 1.类目 1)声明类目 @interface NSString (NumberConvenience) -(NSNumber *)lengthAsNumber; @end 该声明具有2个特点.首先,

OC教程3-类目延展协议

OC3-语言特性 本章主要讲解OC语言特性 类目(Category) 延展(Extension) 协议(Protocol) 1,类目 OC语言中的类目机制只有一个作用:为任何一个类添加方法 现在我们创建一个Student类 @interface Student : NSObject @property(nonatomic,strong)NSString * name; @end @implementation @end 如果想为Student类添加一个方法,现在有两种方法 直接修改Student

类目 延展 单例 协议

//类目#import <Foundation/Foundation.h> //声明一个NSString的分栏 @interface NSString (compareValue) - (NSComparisonResult)compareValue:(NSString *)string; @end ---------------------------------- #import "NSString+compareValue.h" @implementation NSS