zoukankan      html  css  js  c++  java
  • iOS类目

    首先我们解释一下类目是什么

    iOS中类目是为给已经存在的类加入新的方法。(可是不能加入实例变量)

    也就是说 我们已经有一个类了 。可是我们发现这个类眼下所提供的方法,满足不了我们的需求,我们须要新的方法。可是我们有不想或者不能动这个类的原始写法。此时类目就能够实现不用动这个类的情况下 为他加入新的方法。

    比方说:

    假如,我们把人看作一个类。我们对人的定义包含吃饭。睡觉。穿衣等等。

    他的方法包含了 怎样吃饭,怎样穿衣,怎样睡觉等等

    可是。有一天汽车出现了,我们发现我们之前对人的定义没有 开汽车这种方法。可是大家对人的定义都已经打包了。不能再去改人这个类的源码了。

    这时候我们能够通过类目来给人加入一个开汽车的方法,此时我们不须要改动人的属性。人还是一个脑袋,两仅仅胳膊,两条腿。可是人的方法多了一个开汽车。


    一般在系统提供的类中会使用到。比方说NSString 我们仅仅能看到.h方法。看不到.m方法。

    我们要想给它加入一个方法。但是操作不了.m的。此时就能够使用类目来实现。


    下边我们以一个样例来看一下。

    比方说NSString 我们想给他加入一个urlecode urldecode两个方法

    我们新建一个类(一般的起名规则是 原始类名+自己起一个名字)比方说给NSString加入url相关方法。我们起名NSString+URL

    类名的写法:【原始类名:(自己起的名字)】

    .h文件例如以下

    #import <Foundation/Foundation.h>
    
    @interface NSString(URL)
    
    -(NSString *)URLEncodedString;
    
    -(NSString *)URLDecodedString;
    
    @end
    


    我们给他加入了两个方法

    URLEncodedString();

    URLDecodedString()。

    我们再来看.m文件

    #import "NSString+URL.h"
    
    @implementation NSString(URL)
    
    -(NSString *)URLEncodedString
    {
        // CharactersToBeEscaped = @":/?&=;+!@#$()~',*";
        // CharactersToLeaveUnescaped = @"[].";
        
        NSString *encodedString = (NSString *)
        CFBridgingRelease(CFURLCreateStringByAddingPercentEscapes(kCFAllocatorDefault,
                                                                  (CFStringRef)self,
                                                                  NULL,
                                                                  (CFStringRef)@"!*'();:@&=+$,/?%#[]",
                                                                  kCFStringEncodingUTF8));
        
        return encodedString;
    }
    
    -(NSString *)URLDecodedString
    {
        
        NSString *decodedString=(__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(NULL, (__bridge CFStringRef)self, CFSTR(""), CFStringConvertNSStringEncodingToEncoding(NSUTF8StringEncoding));
        
        return decodedString;
    }
    
    @end


    我们看到 除过类名写法特殊以外其它方法的实现等 和一般类的写发都同样


    这个时候我们就给NSString 类加入了两个新的方法。那么怎样使用了?

    在我们须要使用的类中 记得导入我们新建的类目

    #import "NSString+URL.h"


    然后我们就能够在导入了 类目的类中 用NSString 的对象调用 URLEncodedString(); URLDecodedString();这两个方法了 ,就好像NSString 本身就有这两个方法一样


    NSString *readyEcodeStr=@"adsfa asdfa s+asdf";//准备urlecode的字符串  
        NSString *ecodeStr=[self URLEncodedString:readyEcodeStr];  
        NSLog(@"readyEcodeStr=%@  ecodeStr=%@",readyEcodeStr,ecodeStr);

    我们 看到上边的NSString对象 readyEcodeStr 调用方法URLEncodedString 方法和普通的调用没什么两样


    终于结果例如以下

    readyEcodeStr=adsfa asdfa s+asdf  

    ecodeStr=adsfa%20asdfa%20s%2Basdf

    (这个样例中的urlencode,urldecode 方法的一般实现我们能够參考:http://blog.csdn.net/lwjok2007/article/details/47023853)


    好了 类目我们就讲到到这。大家有什么不明确的 能够加群讨论

    苹果开发群 :414319235  欢迎增加  欢迎讨论问题



  • 相关阅读:
    Introduction to Mathematical Thinking
    学习 Unix 常用命令
    学习 《UNIX网络编程》
    学习编译并运行C代码
    Introduction to Mathematical Thinking
    Introduction to Mathematical Thinking
    CentOS 6和CentOS 7防火墙的关闭
    centOS 7下无法启动网络(service network start)错误解决办法(应该是最全的了。。。)
    虚拟机中的CentOS 7设置固定IP连接最理想的配置
    使用VMware安装CentOS7详请
  • 原文地址:https://www.cnblogs.com/tlnshuju/p/6829724.html
Copyright © 2011-2022 走看看