协议

协议只有方法的声明(类似于其他编程语言的接口)
 
协议相当于大家都所遵循的
关键字 @protocol 协议名 <所遵循的协议> 默认NSObject
 
@end
 
 
@protocollamcoProtocol <NSObject>
@required //必须实现的方法
-(void)study;

@optional //可实现可不实现的方法
-(void)work;

@end
 
student.h文件
#import<Foundation/Foundation.h>
#import"lamcoProtocol.h"
@interfaceStudeny :NSObject<lamcoProtocol,bank>

@end
 
 
student.m文件
#import"Studeny.h"
@implementationStudeny
-(void)study{
   NSLog(@"%s",__func__);
}
//-(void)work{
//    NSLog(@"%s",__func__);
//}
@end
 
主函数:
#import<Foundation/Foundation.h>
#import"Studeny.h"
#import"OtherStudent.h"
intmain(intargc,constchar* argv[]) {
   @autoreleasepool{
       Studeny*stu=[[Studenyalloc]init];
       
//        [stu study];
        //判断其是否遵循协议
       if([stuconformsToProtocol:@protocol(lamcoProtocol)]) {
           //判断协议是否有该方法
           if([sturespondsToSelector:@selector(study)]){
                [stustudy];
//                [stu work];
            }else{
               NSLog(@"找不到好工作");
            }
        }else{
           NSLog(@"没有参加培训");
        }
       
       if([stuconformsToProtocol:@protocol(lamcoProtocol)]){
           if([sturespondsToSelector:@selector(giveMoney)]) {
               NSLog(@"每月还钱");
            }else{
               NSLog(@"成为黑户");
            }
        }else{
           NSLog(@"不关事");
        }
       
       
       
    }
   return0;
}
 
 

延展

为类创建了私有方法,实现一对多
1个.m对应多个.h文件
就是说一个类的 .m文件可以有多个延展的.h文件
 
延展可以进行成员变量,属性,方法的各种操作
 
延展文件MyClass_add.h
#import"MyClass.h"

@interfaceMyClass()
-(void)add;

@end
 
类文件:Myclass.h
#import<Foundation/Foundation.h>

@interfaceMyClass :NSObject
-(void)select;

@end
 
Myclass.m
 
#import"MyClass.h"
@implementationMyClass
-(void)select{
   NSLog(@"%s",__func__);
}
-(void)add{
   NSLog(@"%s",__func__);
}
@end
 
 
主函数 main.m
 
#import<Foundation/Foundation.h>
#import"MyClass.h"
//到导入延展的头文件
#import"MyClass_add.h"

intmain(intargc,constchar* argv[]) {
   @autoreleasepool{
       MyClass*class=[[MyClassalloc]init];
        [classselect];
        [classadd];
   
    }
   return0;

}
 
 
 
 
 

分类(类目)

1.不能在分类中添加属性,只能添加方法
2.如果再分类里面使用@property,那么它只能生成getter和setter的声明,没有实现
3.如在在分类中写了与本类同名的方法,优先调用分类里面的方法,所以在分类中定义类的时候,尽量避免和本类中的方法重名
4.在分类里面可以访问本类里面所定义的属性
 
 
例子:目录

主函数main.m

#import<Foundation/Foundation.h>

#import"NSString+CategoryNSString.h"

intmain(intargc,constchar* argv[]) {

@autoreleasepool{

NSString*str=@"abc";

NSLog(@"%@", [str Reverser]);

NSLog(@"%d",[str leng].intValue);

}

return0;

 
}
 
 
类目文件:NSString+CategoryNSString.h

#import<Foundation/Foundation.h>

@interfaceNSString (CategoryNSString)

-(NSString*)Reverser;

-(NSNumber*)leng;

 
@end
 
类目文件:NSString+CategoryNSString.m
 

#import"NSString+CategoryNSString.h"

@implementationNSString (CategoryNSString)

/**

* 字符串反转函数

*

*  @param string传入的字符串

*

*  @return逆序后的字符串

*/

-(NSString*)Reverser{

NSMutableString*str=[NSMutableStringstring];

for(unsignedlongi=(self.length); i>0; i--) {

[strappendFormat:@"%c",[selfcharacterAtIndex:i-1]];

}

returnstr;

}

/**

* 把字符串长度int类型变成NSNumber类型

*

*  @param string出入的字符串

*

*  @return NSNumber,字符串的长度

*/

-(NSNumber*)leng{

NSNumber*num=[[NSNumberalloc]initWithUnsignedLong:self.length];

returnnum;

}

 
@end
 
 
类目的优化
把所有的分类都放到一个分类中MyClass.h
#import<Foundation/Foundation.h>

@interfaceMyClass :NSObject
-(void)Select;
@end
@interfaceMyClass (CategoryUpdate)
-(void)update;
@end

@interfaceMyClass (CategoryAdd)
-(void)add;
@end

@interfaceMyClass (CategoryDeleta)
-(void)delect;

@end
 
MyClass.m文件
#import"MyClass.h"
 
 
@implementationMyClass
-(void)Select{
   NSLog(@"%s",__func__);
}
@end
 
MyClass+CategoryAdd.m文件
 
#import"MyClass.h"

@implementationMyClass (CategoryAdd)
-(void)add{
   NSLog(@"%s",__func__);
   
}

@end
 
MyClass+CategoryUpdate.m文件
#import"MyClass.h"

@implementationMyClass (CategoryUpdate)
-(void)update{
   NSLog(@"修改");
}

@end
 
MyClass+CategoryDeleta.m文件
#import"MyClass.h"

@implementationMyClass (CategoryDeleta)
-(void)delect{
   NSLog(@"删除");
}

@end
总结:1.为了避免更多的代码,和类目的扩展,把类目的.h文件中全部放在要扩展的类中,并且把他们对应的.h文件删除 2.第二步把类目中相之对应的.m文件,把他们的
#import"MyClass+CategoryDeleta” 全部改成本来的类 如:#import "MyClass.h" 就可以了
 

#import ,@class ,#include三者之间的区别

#import是Objective-C导入头文件的关键字,#include是C/C++导入头文件的关键字,使用#import头文件会自动只导入一次,不会重复导入,相当于#include和#pragma once;@class告诉编译器某个类的声明,当执行时,才去查看类的实现文件,可以解决头文件的相互包含;#import<>用来包含系统的头文件,#import””用来包含用户头文件。
@class就是两个类之间的相互引用
 
@class的作用是告诉编译器,有这么一个类,用吧,没有问题
@class还可以解决循环因爱的问题,例如A.h中导入了B.h,而B.h导入了A.h,每一个头文件的编译都要让对象先编译成功才行,使用@class就可以避免这种情况的发生
 

object-c中的类目,延展,协议的更多相关文章

  1. Objective-C中的类目,延展,协议

    Objective-C中的类目(Category),延展(Extension),协议(Protocol)这些名词看起来挺牛的,瞬间感觉OC好高大上.在其他OOP语言中就没见过这些名词,刚看到这三个名词 ...

  2. Objective-C中的类目(Category),延展(Extension)

    类目和延展的作用都是为了扩展一个类. Objective-C中的类目(Category) 一.类目的定义和作用 类目也叫分类,英文Category,在没有原类.m文件的基础上,给该类添加方法. 比如, ...

  3. Objective-C学习笔记类目、协议

    不是所有的方法都可以被覆盖的!比如:intValue就不能被覆盖!! 原因正在查找中! 别人的电脑上却可以! 类目.h件 #import <Foundation/Foundation.h> ...

  4. OC中协议, 类目, 时间, 延展, 属性

    只有继承和协议需要引IMPORT "头文件"; 必须接受marryprotocol协议, id<marryprotocol>基于类型的限定, 才能给实例变量赋值 @pr ...

  5. OC 中 类目、延展和协议

    Category : 也叫分类,类目. *是 为没有源代码的类 扩充功能 *扩充的功能会成为原有类的一部分,可以通过原有类或者原有类的对象直接调用,并且可继承 *该方法只能扩充方法,不能扩充实例变量 ...

  6. iOS -类目,延展,协议

    1.类目 类目就是为已存在的类添加新的方法.但是不能添加实例变量.比如系统的类,我们看不到他的.m文件,所以没有办法用直接添加方法的方式去实现. @interface NSMutableArray ( ...

  7. 寒假 OC-代理,类目,内存,协议,延展,数组,字典,集合

     OC04字符串博客:1.http://www.cnblogs.com/heyonggang/p/3452556.html (字符串常用方法)2.http://blog.sina.com.cn/s/b ...

  8. OC: 类的扩展、类的延展、协议、 NSDate

      NSDateFormatter 指定⽇日期格式: NSDateFormatter * formatter = [[NSDateFormatter alloc] init]; [formatter ...

  9. 类的扩展--类目和延展--ios

    person+money.h  这是类目类 #import "Person.h" //这是扩展person类的接口类,独立一个文件 @interface Person (Money ...

随机推荐

  1. iOS开发UI篇—CAlayer(自定义layer)

    iOS开发UI篇—CAlayer(自定义layer) 一.第一种方式 1.简单说明 以前想要在view中画东西,需要自定义view,创建一个类与之关联,让这个类继承自UIView,然后重写它的Draw ...

  2. window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法

    window下在同一台机器上安装多个版本jdk,修改环境变量不生效问题处理办法 本机已经安装了jdk1.7,而比较早期的项目需要依赖jdk1.6,于是同时在本机安装了jdk1.6和jdk1.7. 安装 ...

  3. cefsharp在xp上运行

    今天遇到一个坑.也是自己英语不足的体现.在xp上运行cefsharp.wpf. 查询了各种资料.按照说明一步一步的操作,都没有解决xp上运行cefsharp.wpf. 而且在xp上调试都不知道错误在哪 ...

  4. ASP.NET MVC读取XML并使用ViewData显示

    看到网上一个网友问及,无法获取XML某一个节点内容.下面Insus.NET在ASP.NET MVC环境下实现它. 先把XML文件放入App_Data目录,当然你可以放在自建目录中.打开看看它有几层,几 ...

  5. 小米手机(HM1SW)高通开发android程序全过程

    小米手机(HM1SW)开发android程序全过程 修改历史: 2016年5月9日  --------  整理文档 a.增加了手机基本信息. b.增加360手机助手连接说明 2016年2月26日  - ...

  6. 跟我一起玩转Sencha Touch 移动 WebApp 开发(一)

    1.目录 移动框架简介,为什么选择Sencha Touch? 环境搭建 创建项目框架,框架文件简介 创建简单Tabpanel案例 自定义图标的方式 WebApp产品测试和发布 HTML5离线缓存 发布 ...

  7. ucenter的单点登录

    所谓单点登录,无非就是几个站点共用一个用户中心,实现同步登陆,同步退出. 服务器端:Loog SSO . 客服端: ucenter,说实话dz商业化确实让php发展了不少. ucenter 基本原理: ...

  8. windows 下mysql每日定时备份的几种方法

    第一种:新建批处理文件 backup.dat,里面输入以下代码:  代码如下 复制代码 net stop mysql xcopy "C:/Program Files/MySQL/MySQL ...

  9. AX Dynamics 去中文字符长度:中文字符当2个字符处理

    static void jw_testStrByteLen(Args _args){    str _str = "A你好";                  System.Te ...

  10. Dialog对话框

    1.显示内容 AlertDialog.Builder builder = new AlertDialog.Builder(MainActivity.this); builder.setTitle(&q ...