标签:
类目(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 *str=@"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-类目延展协议
标签:
原文地址:http://www.cnblogs.com/zhaochaobin/p/5236730.html