OC-类目延展协议

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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;
}
 
 
 
 
 
 
 
 
 
 
 
 
 

以上是关于OC-类目延展协议的主要内容,如果未能解决你的问题,请参考以下文章

iOS设计之--OC学习总结之延展类目协议

Objective-C中的类目,延展,协议

iOS类目延展和协议

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

OC第九节 类的扩展

Objective-C中的类目(Category),延展(Extension)