类别:
类别就是为已存在的类或自定义的类添加新的方法,但是不能添加实例变量;
取类别名的时候要做到“见名知意”;
延展:
延展就是定义自己的私有变量,私有对象以及私有方法。延展属于类的一部份。
创建方式:
通过创建新的文件,选择延展类来创建;
直接在类的.m文件中创建;
委托代理:
委托需要协议来支持;
协议只声明了方法但不去实现,由委托的对象负责实现;
协议由@protocol来声明,协议名称一般用" 类名+Delegate";
协议中的方法分必须时间@required和可选实现@optional之分。
类别:
NSMutableArray+AddNumber.h文件
#import <Foundation/Foundation.h>
@interface NSMutableArray (AddNumber) //注意:类别只能添加方法,不能添加实例变量,对象,属性
//类别方法
- (void)addNumber:(int)num;//添加整型
- (int)numberAtIndex:(int)index;//根据索引返回指定数组元素
- (void)removeNumberAtIndex:(int)index;//根据索引删除指定数组元素
@end
NSMutableArray+AddNumber.m文件
#import "NSMutableArray+AddNumber.h"
@implementation NSMutableArray (AddNumber)
//给哪个类添加类别,当前self指的就是这个类对象本身
//添加整型
- (void)addNumber:(int)num
{
[selfaddObject:[NSNumbernumberWithInt:num]];
}
//根据索引返回指定数组元素
- (int)numberAtIndex:(int)index
{
NSNumber *number = [selfobjectAtIndex:index];
return [number intValue];
}
//根据索引删除指定数组元素
- (void)removeNumberAtIndex:(int)index
{
[selfremoveObjectAtIndex:index];
}
@end
延展:
student.h文件:
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property (nonatomic,strong) NSString *name;
@property (nonatomic)int age;
/**
@功能:初始化学生对象
@参数:姓名年龄 性别班级
@返回值:当前对象
*/
- (id)initWithName:(NSString*)name age:(int)age sex:(char)sex banji:(NSString*)banji;
/**
@功能:显示详细信息
@参数:无
@返回值:无
*/
- (void)showInfomation;
@end
student.m文件:
#import "Student.h"
#import "Student_StudentExtension.h"
//@interface Student()
//{
// //延展中可定义变量和对象
// char _sex;
// NSString *_banji;
//}
//
////延展中可定义属性
//@property (nonatomic) char sex; //性别
//@property (nonatomic, strong) NSString *banji; //班级
//
//
///**
// @功能:显示更多学员信息
// @参数:无
// @返回值:无
// */
//- (void)showMoreInfomation;
//
//@end
@implementation Student
@synthesize name = _name;
@synthesize banji = _banji;
- (void)dealloc
{
self.name =nil;
self.banji =nil;
[super dealloc];
}
/**
@功能:初始化学生对象
@参数:姓名年龄 性别班级
@返回值:当前对象
*/
- (id)initWithName:(NSString*)name age:(int)age sex:(char)sex banji:(NSString*)banji
{
self = [superinit];
if (self) {
self.name = name;
self.age = age;
//使用了延展的属性
self.sex = sex;
self.banji = banji;
}
return self;
}
/**
@功能:显示详细信息
@参数:无
@返回值:无
*/
- (void)showInfomation
{
NSLog(@"姓名:%@年龄:%d",self.name,self.age);
[selfshowMoreInfomation];
}
/**
@功能:显示更多学员信息
@参数:无
@返回值:无
*/
- (void)showMoreInfomation
{
NSLog(@"性别:%c班级:%@",self.sex,self.banji);
}
@end
#import "Student.h"
@interface Student()
{
//延展中可定义变量和对象
char _sex;
NSString *_banji;
}
//延展中可定义属性
@property (nonatomic)char sex; //性别
@property (nonatomic,strong) NSString *banji;//班级
/**
@功能:显示更多学员信息
@参数:无
@返回值:无
*/
- (void)showMoreInfomation;
@end
委托代理:
1,写协议
2,写协议必须或可选实现的方法。
3,委托对象创建;
4,协议确认;
5,实现委托。
具体步骤如下:(123步)
//协议
@protocol CustomerDelegate <NSObject>//协议名=类名+Delegate
//协议必须实现的方法
@required
- (void)food:(NSString*)foodMsg;
- (void)water:(NSString*)waterMsg;
//协议可选实现的方法
@optional
- (void)moreFood:(NSString*)msg;
- (void)moreWater:(NSString*)msg;
@end
@interface Customer : NSObject
@property (nonatomic,assign) id<CustomerDelegate> delegate;//委托对象, assign表示弱引用,不拥有对象的使用权,不会让对象引用计数值加1
- (void)prepareEatFood; //准备吃饭
@end
(4步)
#import <Foundation/Foundation.h>
#import "Customer.h"
@interface Cooker :NSObject <CustomerDelegate>//<CustomerDelegate>表示确认协议
@end
(5步)
- (id)init
{
if (self=[superinit]) {
NSLog(@"来了一个顾客");
Customer *aCustomer = [[Customeralloc] init];//来了一个顾客
aCustomer.delegate = self;//顾客选定厨师 (这里就是委托)
[aCustomer prepareEatFood];//顾客准备点餐
[aCustomer release];//顾客吃完后离开餐馆
}
return self;
}
//...........// 执行的方法