Protocol Block成员变量补充

简介: Student.h: #import @protocol Study,Learn;@interface Student : NSObject@end Student.

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



相关文章
|
11月前
|
JSON Java 数据库
代码重构实战-将值对象改为引用对象(Change Value to Reference)
一个数据结构中可能包含多个记录,而这些记录都关联到同一个逻辑数据结构。例如,我可能会读取一系列订单数据,其中有多条订单属于同一个顾客。遇到这样的共享关系,既能将顾客信息作为值对象看待,也能将其视为引用对象
79 0
cobrautils 使用反射获取 flag 配置, 支持指针字段
cobrautils 使用反射获取 flag 配置, 支持指针字段
cobrautils 使用反射获取 flag 配置, 支持指针字段
|
存储 Java
Java基础:static的理解(含义、用法及静态修饰的优先顺序)
Java基础:static的理解(含义、用法及静态修饰的优先顺序)
142 0
Java基础:static的理解(含义、用法及静态修饰的优先顺序)
|
JavaScript 前端开发 开发者
从规范的角度看 this 丢失 —— 详解 Reference Type
从规范的角度看 this 丢失 —— 详解 Reference Type
96 0
从规范的角度看 this 丢失 —— 详解 Reference Type
|
存储 C#
【.Net底层剖析】2.stfld指令-给对象的字段赋值
【.Net底层剖析】2.stfld指令-给对象的字段赋值
128 0
【.Net底层剖析】2.stfld指令-给对象的字段赋值
|
C++
warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”
warning C4250: “MyClassD”: 通过域控制继承“MyClassC::MyClassC::MyMethod”
287 0
Java内存区域对象的内存布局和访问定位(Header、Instance、Padding)
Java普通对象被创建出以后,就需要关注下它在JVM堆中的内存布局是什么样子的。 大致分为3个区域: 1.对象头(Header) 2.实例数据(Instance) 3.对齐补充(Padding) 1.对象头(Header) 对象头在JVM这本书中有个专门的章节去讲Class文件的布局,这一章还没有去看,因此,对于这个暂时没有什么概念。
7277 0
|
JSON C# 数据格式
C# 使用dynamic类型来访问JObject对象
原文:C# 使用dynamic类型来访问JObject对象 dynamic是C#里面的动态类型,可在未知类型的情况访问对应的属性,非常灵活和方便。 使用Json.Net可以把一个Json字符串转换成一个JObject对象,如果有已知强类型,如果有已知对应的强类型,可以直接转成对应的类型。
1308 0