您的位置:首页 > 移动开发 > Objective-C

类别、延展、委托代理(16.5.12)

2016-05-12 19:23 309 查看
类别:

类别就是为已存在的类或自定义的类添加新的方法,但是不能添加实例变量;

取类别名的时候要做到“见名知意”;

延展:

延展就是定义自己的私有变量,私有对象以及私有方法。延展属于类的一部份。

创建方式:

通过创建新的文件,选择延展类来创建;

直接在类的.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

Student_StudentExtension.h文件:

#import "Student.h"

@interface Student()

{

   
//延展中可定义变量和对象

    char _sex;

    NSString *_banji;

}

//延展中可定义属性

@property (nonatomic)char sex;
//性别

@property (nonatomic,strong)
NSString *banji;//班级

/**

 @功能:显示更多学员信息

 @参数:无

 @返回值:无

 */

- (void)showMoreInfomation;

@end

类别、延展总结: 类别只能加方法。延展都可以加。//给哪个类添加类别,当前self指的就是这个类对象本身 延展只能定义自己的私有变量,私有对象和私有方法。 延展属于类的一部分。(可以创建新文件,也可以在。m文件中创建)。创建的时候只有一个。h文件。都在类的。m里面实现。(为自己服务)。

委托代理:

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;

}

//...........// 执行的方法
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息