Protocol Block成员变量补充

简介:

Student.h:

#import <Foundation/Foundation.h> @protocol Study,Learn; @interface Student : NSObject<Study,Learn>  @end

Student.m:

#import "Student.h" #import "Study.h" #import "Learn.h" @implementation Student  @end


Study.h:

#import <Foundation/Foundation.h>  @protocol Study <NSObject> //@required表示必须实现 //随便字面上说是必须实现,但是编译器并不强求实现 @required -(void)test1; -(void)test2; //@optional表示可选(可实现,也可以不实现) @optional -(void)test3; @end

Learn.h:

#import <Foundation/Foundation.h>  @protocol Learn <NSObject>  @end

main:

#import <Foundation/Foundation.h> #import "Student.h" #import "Learn.h"  @protocol Study;  int sum(int a,int b){     return a+b; }  void test(){     //调用block方法求和     int c=sum(10,10);     NSLog(@"调用block方法求和:%i",c); }  void test1(){     //定义了Sum这种block类型     typedef int (^Sum1) (int,int);     //定义了SumP这种指针类型,指向函数的     typedef int (*SumP) (int,int);     //定义了一个sum的Block变量     Sum1 Sum12=^(int a,int b){         return a+b;     };     int s=Sum12(10,10);     NSLog(@"sum:%i",s);     //因为宏定义的时候已经包含了*,所以在定义变量的时候不需要加*了     SumP p=sum;     //int j=(*p)(20,30);     int j=p(20,30);     NSLog(@"函数sum:%i",j); } int main(int argc, const char * argv[]) {      @autoreleasepool {                  Student *stu=[[[Student alloc] init] autorelease];         //conformsToProtocol:判断是否遵守了协议         if([stu conformsToProtocol:@protocol(Study)])         {             NSLog(@"遵守了Study协议");         }         //respondsToSelector:判断是否实现了某一方法         if(![stu respondsToSelector:@selector(test)])         {             NSLog(@"Student没有实现这个方法");         }          //block的实现,block跟函数调用差不多,但block可以写在任何地方,函数不能写在函数内部,block跟指向函数的指针用法一样         int (^Sum)(int,int)=^(int a,int b){             return a+b;         };         //调用block方法求和         int c=Sum(10,10);         NSLog(@"调用block方法求和:%i",c);         //调用函数方法求和         int d=sum(11, 11);         NSLog(@"调用函数方法求和:%i",d);         //调用函数指针的方法求和,定义一个指针指向一个函数         int(*sumP)(int,int)=sum;         //(*sump)代表指向的函数         int i=(*sumP)(22,22);         NSLog(@"调用指向函数的指针的方法来求和:%i",i);          NSLog(@"******************************************");        test1();     }     return 0; }

结果:

2013-08-02 14:53:13.490 Protocol Block 成员变量补充[713:303] 遵守了Study协议

2013-08-02 14:53:13.491 Protocol Block 成员变量补充[713:303] Student没有实现这个方法

2013-08-02 14:53:13.492 Protocol Block 成员变量补充[713:303] 调用block方法求和:20

2013-08-02 14:53:13.493 Protocol Block 成员变量补充[713:303] 调用函数方法求和:22

2013-08-02 14:53:13.493 Protocol Block 成员变量补充[713:303] 调用指向函数的指针的方法来求和:44

2013-08-02 14:53:13.493 Protocol Block 成员变量补充[713:303] ******************************************

2013-08-02 14:53:13.494 Protocol Block 成员变量补充[713:303] sum:20

2013-08-02 14:53:13.494 Protocol Block 成员变量补充[713:303] 函数sum50






















本文转自蓬莱仙羽51CTO博客,原文链接:http://blog.51cto.com/dingxiaowei/1366482,如需转载请自行联系原作者


相关文章
|
7月前
|
JavaScript
type和interface的异同?
type和interface的异同?
88 0
|
7月前
type 和 interface的异同
type 和 interface的异同
45 0
|
JSON Java 数据库
代码重构实战-将值对象改为引用对象(Change Value to Reference)
一个数据结构中可能包含多个记录,而这些记录都关联到同一个逻辑数据结构。例如,我可能会读取一系列订单数据,其中有多条订单属于同一个顾客。遇到这样的共享关系,既能将顾客信息作为值对象看待,也能将其视为引用对象
107 0
|
C++
warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”
warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”
329 0
|
安全 C# 索引
.NET面试题解析(05)-常量、字段、属性、特性与委托
转自:http://www.cnblogs.com/anding/p/5255492.html   常见面试题目: 1. const和readonly有什么区别? 2. 哪些类型可以定义为常量?常量const有什么风险? 3.
1340 0
重构——21将引用对象改为值对象(Change Reference to Value)
将引用对象改为值对象(Change Reference to Value):你有一个引用对象,很小且不可改变,而且不容易管理;将它变为一个值对象
1418 0
重构——20将值对象改为引用对象(Change Value to Reference)
将值对象改为引用对象(Change Value to Reference):你从一个类衍生出许多彼此相等的实例,希望将它们替换为同一对象;将这个值对象变成引用对象
1371 0