类目(Category)
延展(Extension)
协议(Protocol)
一.类目
OC语言中的类目机制只有一个作用:为任何一个类添加方法
注意:
2.如果再分类里面使用@property,那么它只能生成getter和setter的声明,没有实现
3.如在在分类中写了与本类同名的方法,优先调用分类里面的方法,所以在分类中定义类的时候,尽量避免和本类中的方法重名
我们为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;
}
延展可以看作是一种匿名的类目,类有时需要一些只为自己所见,所用的私有方法这种私有方法可以通过延展的方式来声明。
#import "MyClass.h"
@interface MyClass ()
-(void)add;
#import <Foundation/Foundation.h>
@interface MyClass : NSObject
-(void)select;
#import "MyClass.h"
@implementation MyClass
-(void)select{
NSLog(@"%s",__func__);
}
-(void)add{
NSLog(@"%s",__func__);
}
#import <Foundation/Foundation.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
@protocol lamcoProtocol <NSObject>
@required //必须实现的方法
-(void)study;
@optional //可实现可不实现的方法
-(void)work;
#import <Foundation/Foundation.h>
#import "lamcoProtocol.h"
@interface Studeny : NSObject<lamcoProtocol,bank>
#import "Studeny.h"
@implementation Studeny
-(void)study{
NSLog(@"%s",__func__);
}
//-(void)work{
// NSLog(@"%s",__func__);
#import <Foundation/Foundation.h>
#import "Studeny.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;