一.Protocol
类似接口
里面的方法,不必要全部实现
//对协议进行提前声明,和@class一样
@protocol ButtonDelegate;
@protocol
ButtonDelegate <NSObject> //代表实现协议
下面看一下代码:
-
//
-
// Button.h
-
// Protocol
-
//
-
// Created by 金海洋 on 15-3-27.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
@class Button;
-
-
@protocol ButtonDelegate <NSObject>
-
-
-(void)onClick:(Button *)bb;
-
-
@end
-
-
-
@interface Button : NSObject
-
-
//delegate 就是按钮监听器
-
@property (nonatomic,retain) id <ButtonDelegate>delegate;
-
-
-(void)click;
-
-
@end
-
//
-
// Button.m
-
// Protocol
-
//
-
// Created by 金海洋 on 15-3-27.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import "Button.h"
-
-
@implementation Button
-
-
-(void)dealloc{
-
-
[_delegate release];
-
-
[super dealloc];
-
}
-
-
-(void)click{
-
//如果_delegate实现了onClick:方法就返回true
-
if( [_delegate respondsToSelector:@selector(onClick:)] ){
-
//按钮被点击了,并且告诉监听器哪个按钮被点击了
-
[_delegate onClick:self];
-
}
-
-
}
-
-
@end
-
//
-
// ButtonA.h
-
// Protocol
-
//
-
// Created by 金海洋 on 15-3-27.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
#import "Button.h"
-
-
@interface ButtonA : NSObject<ButtonDelegate>
-
-
@end
-
//
-
// ButtonA.m
-
// Protocol
-
//
-
// Created by 金海洋 on 15-3-27.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import "ButtonA.h"
-
@class Button;
-
-
@implementation ButtonA
-
-
-(void)onClick:(Button *)b{
-
-
NSLog(@"%@双击按钮了",b);
-
}
-
-
@end
-
//
-
// main.m
-
// Protocol
-
//
-
// Created by 金海洋 on 15-3-27.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
#import "Button.h"
-
#import "ButtonLi.h"
-
#import "ButtonA.h"
-
-
int main(int argc, const char * argv[]) {
-
@autoreleasepool {
-
//初始化按钮
-
Button *bu = [[[Button alloc] init] autorelease];
-
//初始化按钮监听器
-
ButtonA *bul = [[[ButtonA alloc] init] autorelease];
-
-
//设施按钮的监听器
-
bu.delegate = bul;
-
//点击按钮
-
[bu click];
-
-
-
}
-
return 0;
-
}
二.block
Block,代码段
Xcode4.0之后才推出来的
封装了一块儿代码,想要执行的时候可以执行
要告诉bolck的返回值和参数类型
下面看一个block的例子:
-
int main(int argc, const char * argv[]) {
-
@autoreleasepool {
-
-
// Button *b = [[[Button alloc]init]autorelease];
-
-
//block
-
int (^sum) (int,int) = ^(int a,int b){
-
-
return a+b;
-
};
-
-
-
int a = sum(123,9);
-
-
-
NSLog(@"%d",a);
-
}
-
return 0;
-
}
另一种写法
-
typedef int (^Mysum) (int,int);
-
-
int main(int argc, const char * argv[]) {
-
@autoreleasepool {
-
-
// Button *b = [[[Button alloc]init]autorelease];
-
-
//block
-
//int (^sum) (int,int) = ^(int a,int b){
-
-
// return a+b;
-
//};
-
-
Mysum sum = ^(int a,int b){
-
-
return a+b;
-
};
-
-
int a = sum(123,9);
-
-
-
NSLog(@"%d",a);
-
}
-
return 0;
-
}
可以访问外部变量,但是默认情况下不可以修改
-
typedef int (^Mysum) (int,int);
-
int main(int argc, const char * argv[]) {
-
@autoreleasepool {
-
-
// Button *b = [[[Button alloc]init]autorelease];
-
-
int c =111;
-
-
Mysum sum = ^(int a,int b){
-
-
NSLog(@"%d",c);
-
return a+b;
-
};
-
-
int a = sum(123,9);
-
-
-
NSLog(@"%d",a);
-
}
-
return 0;
-
}
前面加上__block的话就可以修改
-
typedef int (^Mysum) (int,int);
-
int main(int argc, const char * argv[]) {
-
@autoreleasepool {
-
-
// Button *b = [[[Button alloc]init]autorelease];
-
-
__block int c =111;
-
-
Mysum sum = ^(int a,int b){
-
-
c++;
-
NSLog(@"%d",c);
-
return a+b;
-
};
-
-
int a = sum(123,9);
-
-
-
NSLog(@"%d",a);
-
}
-
return 0;
-
}
下面根据block写一个回调函数的例子:
-
//
-
// Button.h
-
// Block
-
//
-
// Created by 金海洋 on 15-4-10.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
-
@class Button;
-
-
typedef void(^btt) (Button*);
-
-
@interface Button : NSObject
-
-
@property (nonatomic,assign) btt block;
-
-
-(void)click;
-
-
@end
-
//
-
// Button.m
-
// Block
-
//
-
// Created by 金海洋 on 15-4-10.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import "Button.h"
-
-
@implementation Button
-
-
-(void)click{
-
-
_block(self);
-
//self.block(self);
-
-
}
-
-
@end
-
//
-
// main.m
-
// Block
-
//
-
// Created by 金海洋 on 15-4-10.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
#import "Button.h"
-
-
int main(int argc, const char * argv[]) {
-
@autoreleasepool {
-
-
Button *b =[[[Button alloc]init]autorelease];
-
-
b.block = ^(Button *b){
-
-
NSLog(@"按钮被点击了!!!");
-
};
-
-
[b click];
-
-
}
-
return 0;
-
}
三.协议的补充
看下面的代码:
-
//
-
// Student.h
-
// 协议补充
-
//
-
// Created by 金海洋 on 15-4-12.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
-
@protocol Student <NSObject>
-
-
//必须得实现下面方法
-
//虽然是必须实现的,但是不实现的话,编译器也不会报错,OC是个弱语法
-
//什么都不写的话,默认是@required
-
@required
-
-(void)test;
-
-
//可以实现或者不用实现
-
@optional
-
-(void)test1;
-
-
-(void)test2;
-
-
@end
-
//
-
// main.m
-
// 协议补充
-
//
-
// Created by 金海洋 on 15-4-12.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
#import "Stu.h"
-
-
@protocol Stu,learn;
-
-
int main(int argc, const char * argv[]) {
-
@autoreleasepool {
-
-
Stu *s = [[[Stu alloc]init]autorelease];
-
-
//判断是否遵守了某个协议
-
if ( [s conformsToProtocol:@protocol(Student ) ]){
-
-
NSLog(@"实现了Stu协议");
-
}
-
-
}
-
return 0;
-
}
-
//
-
// Stu.m
-
// 协议补充
-
//
-
// Created by 金海洋 on 15-4-12.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import "Stu.h"
-
#import "Student.h"
-
#import "learn.h"
-
-
@implementation Stu
-
-
@end
-
//
-
// Stu.h
-
// 协议补充
-
//
-
// Created by 金海洋 on 15-4-12.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
//同时实现两个协议
-
-
#import <Foundation/Foundation.h>
-
-
@protocol Student,learn;
-
-
-
@interface Stu : NSObject<Student,learn>
-
-
@end
-
//
-
// learn.h
-
// 协议补充
-
//
-
// Created by 金海洋 on 15-4-12.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
-
@protocol learn <NSObject>
-
-
@end
四.Public的用法
下面看下Public的用法
-
//
-
// Student.h
-
// 成员变量
-
//
-
// Created by 金海洋 on 15-4-12.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
-
@interface Student : NSObject{
-
-
int _no;
-
-
@public
-
int _age;
-
-
}
-
-
@property int age;
-
-
@end
-
//
-
// Student.m
-
// 成员变量
-
//
-
// Created by 金海洋 on 15-4-12.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import "Student.h"
-
-
@implementation Student
-
-
@end
-
//
-
// main.m
-
// 成员变量
-
//
-
// Created by 金海洋 on 15-4-12.
-
// Copyright (c) 2015年 金海洋. All rights reserved.
-
//
-
-
#import <Foundation/Foundation.h>
-
#import "Student.h"
-
-
int main(int argc, const char * argv[]) {
-
@autoreleasepool {
-
-
Student *s = [[Student alloc]init];
-
-
s->_age = 100;
-
-
NSLog(@"---%d---",s.age);
-
-
}
-
return 0;
-
}
-
阅读(560) | 评论(0) | 转发(0) |