【OC笔记】分类和延展

来源:互联网 发布:linux命令 mkdir 编辑:程序博客网 时间:2024/05/21 17:45
分类是对原有类的一种扩展,在分类里可以给原类添加方法,但是不能添加属性。
延展(扩展)是一种匿名的分类,即:分类名为空,在延展中可以给类扩展方法和属性,这些方法和属性是相对私有的,不能被继承。相对私有:调用头文件即可使用。
非正式协议:NSObject类,或者Foundation框架中的类的分类,叫做非正式协议。用于自己定义的类的分类不能称之为非正式协议。
协议:OC中的协议类似于Java中的接口,在协议中提供了一些方法即:只是定义一些方法,不提供方法的实现,需要让遵守该协议的某个类去实现。在协议中的方法分为两种:@required(必须实现) @optional(选择性实现)
代理:某个对象没有办法实现某个方法,需要将这个方法委托给一个对象(一般是id类型)去做。那么这个对象就是原对象的代理。一般需要告诉委托代理的内容是什么(用协议来约束代理对象)。
程序实例:
分类
//类的声明
@interface Person : NSObject
@property (nonatomic, copy)NSString *name;
@end

//分类
@interface Person (base)
-(void)run;
@end

//类的实现
@implementation Person
-(void)run
{
NSLog(@"person run");
}
@end


延展

@interface Person : NSObject
@end


//类扩展
@interface Person ()

//可以定义一些私有的方法和属性(类的对象不能调用,只能用self)
@property (nonatomic, assign) int age;
-(void)eat;
@end


@implementation Person
-(void)eat
{
NSLog(@"person eat");
}
@end

协议和代理
Person类和协议定义

@class Person;

//协议的声明
@protocol callPhone <NSObject>
@required
-(void)linkNum:(int)num;
@end

@interface Person : NSObject
//人打电话
-(void)callNum:(int)num;
//设置代理(实现打电话的方法)
@property (nonatomic, strong) id<callPhone> delegate;
@end


@implementation Person
-(void)callNum:(int)num
{
NSLog(@"人要打电话");
//判断代理是否实现代理方法
if([self.delegate respondsToSelector:@selector(linkNum:)] )
{
[self.delegate linkNum:num];
}
}
@end

Phone类的声明与实现

#import "Person.h"
@interface Phone : NSObject <callPhone>
@end



@implementation Phone
-(void)linkNum:(int)num
{
NSLog(@"正在拨号:%d",num);
}
@end

main函数

#import "Person.h"
#import "Phone.h"

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

Person *p = [Person new];
Phone *phone = [Phone new];
p.delegate = phone;
[p callNum:110];
}
return 0;
}

0 0