Object-c初步学习 四

1.category的用法 不修改对象源文件的方式下,给类添加方法
为Student类添加方法

//
//  NSObject+StudyCategory.h
//

#import
#import "Student.h"

#pragma mark 类名后面的(test)代表Category,可以在不修改原来的类文件的情况下,添加新的方法

//pragma mark - 不可以添加新的成员变量

@interface Student (StudyCategory)

- (void)test:(int)a;

@end

//
//  NSObject+StudyCategory.m
//

#import "Student+StudyCategory.h"
#import "Student.h"

@implementation Student (StudyCategory)

- (void)test:(int)a {
    NSLog(@"Sutdent Category test add %i",a);
}

@end

这样就可以为类Student添加test:方法

外部可直接使用

 Student *stu = [[[Student alloc] init] autorelease];
[stu test:1];

2.protocol的用法 这个是代理,类似java中的interface接口

//
//  StudyProtocol.h
//

#import
@class Button;

#pragma mark <>代表protocol
@protocol StudyProtocol

- (void)onClick:(Button *)btn;

@end

//
//  Button.h
//

#import

@protocol StudyProtocol;

@interface Button : NSObject

@property (nonatomic,retain) id delegate;

- (void)testClick;

@end

//
//  Button.m
//

#import
#import "Button.h"
#import "StudyProtocol.h"

@implementation Button

- (void)testClick{
    //判断有没有当前方法
    if([_delegate respondsToSelector:@selector(onClick:)]){
        [_delegate onClick:self];
    }else{
        [_delegate onClick];
    }
}

- (void)dealloc{
    [_delegate release];
    
    [super dealloc];
}

@end
 

//
//  NSObject+ButtonListener.h
//

#import

#import "StudyProtocol.h"

NS_ASSUME_NONNULL_BEGIN


@interface ButtonListener : NSObject


@end

NS_ASSUME_NONNULL_END
 

//
//  ButtonListener.m
//

#import

#import "ButtonListener.h"

@class Button;

@implementation ButtonListener

- (void)onClick:(Button *)btn{
    NSLog(@"button is click %@",btn);
}

@end
 

使用方法类似java的接口回调机制

     //protocol的用法
        Button *btn = [[Button alloc] init];
        
        ButtonListener *listener = [[ButtonListener alloc]init];
        //设置监听器
        [btn setDelegate: listener];
        
        //模拟点击
        [btn testClick];

你可能感兴趣的:(学习,objective-c)