Chinaunix首页 | 论坛 | 博客
  • 博客访问: 53221
  • 博文数量: 34
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 297
  • 用 户 组: 普通用户
  • 注册时间: 2014-04-09 10:52
文章分类

全部博文(34)

文章存档

2015年(23)

2014年(11)

我的朋友

分类: iOS平台

2015-04-10 11:11:07

一.Protocol

类似接口
里面的方法,不必要全部实现

//对协议进行提前声明,和@class一样

@protocol ButtonDelegate;


@protocol ButtonDelegate <NSObject> //代表实现协议 

下面看一下代码:
 

点击(此处)折叠或打开

  1. //
  2. // Button.h
  3. // Protocol
  4. //
  5. // Created by 金海洋 on 15-3-27.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>
  9. @class Button;

  10. @protocol ButtonDelegate <NSObject>

  11. -(void)onClick:(Button *)bb;

  12. @end


  13. @interface Button : NSObject

  14. //delegate 就是按钮监听器
  15. @property (nonatomic,retain) id <ButtonDelegate>delegate;

  16. -(void)click;

  17. @end



点击(此处)折叠或打开

  1. //
  2. // Button.m
  3. // Protocol
  4. //
  5. // Created by 金海洋 on 15-3-27.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import "Button.h"

  9. @implementation Button

  10. -(void)dealloc{

  11.     [_delegate release];

  12.     [super dealloc];
  13. }

  14. -(void)click{
  15.     //如果_delegate实现了onClick:方法就返回true
  16.     if( [_delegate respondsToSelector:@selector(onClick:)] ){
  17.         //按钮被点击了,并且告诉监听器哪个按钮被点击了
  18.         [_delegate onClick:self];
  19.     }

  20. }

  21. @end

点击(此处)折叠或打开

  1. //
  2. // ButtonA.h
  3. // Protocol
  4. //
  5. // Created by 金海洋 on 15-3-27.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>
  9. #import "Button.h"

  10. @interface ButtonA : NSObject<ButtonDelegate>

  11. @end

点击(此处)折叠或打开

  1. //
  2. // ButtonA.m
  3. // Protocol
  4. //
  5. // Created by 金海洋 on 15-3-27.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import "ButtonA.h"
  9. @class Button;

  10. @implementation ButtonA

  11. -(void)onClick:(Button *)b{

  12.     NSLog(@"%@双击按钮了",b);
  13. }

  14. @end


点击(此处)折叠或打开

  1. //
  2. // main.m
  3. // Protocol
  4. //
  5. // Created by 金海洋 on 15-3-27.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>
  9. #import "Button.h"
  10. #import "ButtonLi.h"
  11. #import "ButtonA.h"

  12. int main(int argc, const char * argv[]) {
  13.     @autoreleasepool {
  14.         //初始化按钮
  15.         Button *bu = [[[Button alloc] init] autorelease];
  16.         //初始化按钮监听器
  17.         ButtonA *bul = [[[ButtonA alloc] init] autorelease];
  18.         
  19.         //设施按钮的监听器
  20.         bu.delegate = bul;
  21.         //点击按钮
  22.         [bu click];
  23.         
  24.         
  25.     }
  26.     return 0;
  27. }


二.block

Block,代码段
Xcode4.0之后才推出来的
封装了一块儿代码,想要执行的时候可以执行
要告诉bolck的返回值和参数类型
下面看一个block的例子:

点击(此处)折叠或打开

  1. int main(int argc, const char * argv[]) {
  2.     @autoreleasepool {
  3.         
  4.       // Button *b = [[[Button alloc]init]autorelease];
  5.         
  6.         //block
  7.         int (^sum) (int,int) = ^(int a,int b){
  8.         
  9.             return a+b;
  10.         };
  11.     
  12.         
  13.         int a = sum(123,9);
  14.         
  15.         
  16.         NSLog(@"%d",a);
  17.     }
  18.     return 0;
  19. }

另一种写法

点击(此处)折叠或打开

  1. typedef int (^Mysum) (int,int);

  2. int main(int argc, const char * argv[]) {
  3.     @autoreleasepool {
  4.         
  5.       // Button *b = [[[Button alloc]init]autorelease];
  6.         
  7.         //block
  8.         //int (^sum) (int,int) = ^(int a,int b){
  9.         
  10.           // return a+b;
  11.         //};
  12.         
  13.         Mysum sum = ^(int a,int b){
  14.             
  15.               return a+b;
  16.             };
  17.         
  18.         int a = sum(123,9);
  19.         
  20.         
  21.         NSLog(@"%d",a);
  22.     }
  23.     return 0;
  24. }

可以访问外部变量,但是默认情况下不可以修改

点击(此处)折叠或打开

  1. typedef int (^Mysum) (int,int);
  2. int main(int argc, const char * argv[]) {
  3.     @autoreleasepool {
  4.         
  5.       // Button *b = [[[Button alloc]init]autorelease];
  6.         
  7.         int c =111;
  8.         
  9.         Mysum sum = ^(int a,int b){
  10.             
  11.             NSLog(@"%d",c);
  12.             return a+b;
  13.         };
  14.         
  15.         int a = sum(123,9);
  16.         
  17.         
  18.         NSLog(@"%d",a);
  19.     }
  20.     return 0;
  21. }

前面加上__block的话就可以修改

点击(此处)折叠或打开

  1. typedef int (^Mysum) (int,int);
  2. int main(int argc, const char * argv[]) {
  3.     @autoreleasepool {
  4.         
  5.       // Button *b = [[[Button alloc]init]autorelease];
  6.         
  7.         __block int c =111;
  8.         
  9.         Mysum sum = ^(int a,int b){
  10.             
  11.             c++;
  12.             NSLog(@"%d",c);
  13.             return a+b;
  14.         };
  15.         
  16.         int a = sum(123,9);
  17.         
  18.         
  19.         NSLog(@"%d",a);
  20.     }
  21.     return 0;
  22. }

下面根据block写一个回调函数的例子:

点击(此处)折叠或打开

  1. //
  2. // Button.h
  3. // Block
  4. //
  5. // Created by 金海洋 on 15-4-10.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>

  9. @class Button;

  10. typedef void(^btt) (Button*);

  11. @interface Button : NSObject

  12. @property (nonatomic,assign) btt block;

  13. -(void)click;

  14. @end


点击(此处)折叠或打开

  1. //
  2. // Button.m
  3. // Block
  4. //
  5. // Created by 金海洋 on 15-4-10.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import "Button.h"

  9. @implementation Button

  10. -(void)click{

  11.     _block(self);
  12.     //self.block(self);
  13.     
  14. }

  15. @end


点击(此处)折叠或打开

  1. //
  2. // main.m
  3. // Block
  4. //
  5. // Created by 金海洋 on 15-4-10.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>
  9. #import "Button.h"

  10. int main(int argc, const char * argv[]) {
  11.     @autoreleasepool {
  12.         
  13.         Button *b =[[[Button alloc]init]autorelease];
  14.         
  15.         b.block = ^(Button *b){
  16.         
  17.             NSLog(@"按钮被点击了!!!");
  18.         };
  19.         
  20.         [b click];
  21.         
  22.     }
  23.     return 0;
  24. }

三.协议的补充

看下面的代码:

点击(此处)折叠或打开

  1. //
  2. // Student.h
  3. // 协议补充
  4. //
  5. // Created by 金海洋 on 15-4-12.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>

  9. @protocol Student <NSObject>

  10. //必须得实现下面方法
  11. //虽然是必须实现的,但是不实现的话,编译器也不会报错,OC是个弱语法
  12. //什么都不写的话,默认是@required
  13. @required
  14. -(void)test;

  15. //可以实现或者不用实现
  16. @optional
  17. -(void)test1;

  18. -(void)test2;

  19. @end

点击(此处)折叠或打开

  1. //
  2. // main.m
  3. // 协议补充
  4. //
  5. // Created by 金海洋 on 15-4-12.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>
  9. #import "Stu.h"

  10. @protocol Stu,learn;

  11. int main(int argc, const char * argv[]) {
  12.     @autoreleasepool {
  13.         
  14.         Stu *= [[[Stu alloc]init]autorelease];
  15.         
  16.         //判断是否遵守了某个协议
  17.         if ( [s conformsToProtocol:@protocol(Student ) ]){
  18.         
  19.             NSLog(@"实现了Stu协议");
  20.         }
  21.         
  22.     }
  23.     return 0;
  24. }



点击(此处)折叠或打开

  1. //
  2. // Stu.m
  3. // 协议补充
  4. //
  5. // Created by 金海洋 on 15-4-12.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import "Stu.h"
  9. #import "Student.h"
  10. #import "learn.h"

  11. @implementation Stu

  12. @end



点击(此处)折叠或打开

  1. //
  2. // Stu.h
  3. // 协议补充
  4. //
  5. // Created by 金海洋 on 15-4-12.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. //同时实现两个协议

  9. #import <Foundation/Foundation.h>

  10. @protocol Student,learn;


  11. @interface Stu : NSObject<Student,learn>

  12. @end



点击(此处)折叠或打开

  1. //
  2. // learn.h
  3. // 协议补充
  4. //
  5. // Created by 金海洋 on 15-4-12.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>

  9. @protocol learn <NSObject>

  10. @end

四.Public的用法

下面看下Public的用法

点击(此处)折叠或打开

  1. //
  2. // Student.h
  3. // 成员变量
  4. //
  5. // Created by 金海洋 on 15-4-12.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>

  9. @interface Student : NSObject{

  10.     int _no;
  11.     
  12.     @public
  13.     int _age;
  14.     
  15. }

  16. @property int age;

  17. @end


点击(此处)折叠或打开

  1. //
  2. // Student.m
  3. // 成员变量
  4. //
  5. // Created by 金海洋 on 15-4-12.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import "Student.h"

  9. @implementation Student

  10. @end


点击(此处)折叠或打开

  1. //
  2. // main.m
  3. // 成员变量
  4. //
  5. // Created by 金海洋 on 15-4-12.
  6. // Copyright (c) 2015年 金海洋. All rights reserved.
  7. //

  8. #import <Foundation/Foundation.h>
  9. #import "Student.h"

  10. int main(int argc, const char * argv[]) {
  11.     @autoreleasepool {
  12.         
  13.         Student *= [[Student alloc]init];
  14.         
  15.         s->_age = 100;
  16.         
  17.         NSLog(@"---%d---",s.age);
  18.         
  19.     }
  20.     return 0;
  21. }


 





阅读(560) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~