`
dingran
  • 浏览: 372126 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

ios的categories概念Demo

 
阅读更多

         JAVA里面要想给类增加个方法,必须继承才行,要想改变方法需要覆盖,感觉总有不能办到的,而且也麻烦。

ios的 Categories真是让我打开眼界啊!直接就可以给FrameWork的类增加函数,且可以修改。牛逼啊,即使是不开源又能怎地,就是封装的好啊,好用就行了呗。要是研究OS还是去找Android吧。

         以下内容是copy的:http://mobile.51cto.com/hot-232833_8.htm

 

        当然他也是翻译的,我们可以直接看最原始的文章风格也非常漂亮的:http://cocoadevcentral.com/d/learn_objectivec/

 

         Categories是Objective-C里面最常用到的功能之一。 基本上category可以让我们给已经存在的类增加方法,而不需要增加一个子类。而且不需要知道它内部具体的实现。

如果我们想增加某个framework自带的类的方法,这非常有效。如果我们想在我们程序工程的NSString能够增加一个方法,我们就可以使用category。甚至都不需要自己实现一个NSString的子类。

比如,我们想在NSString里面增加一个方法来判断它是否是一个URL,那我们就可以这么做:

 

 

@interface NSString (NSString_Utils)

 

- (BOOL ) isUrl;

 

@end

 

这跟类的定义非常类似。区别就是category没有父类,而且在括号里面要有category的名字。名字可以随便取,但是习惯叫法会让人比较明白category里面有些什么功能的方法。

这里是具体的实现。但是要注意,这本身并不是一个判断URL很好的实现。我们主要是为了整体的了解category的概念。

 

 

 

#import "NSObject+NSString_Utils.h"

 

@implementation NSObject (NSString_Utils)

 

- (BOOL ) isUrl

{

    if ([self hasPrefix :@"http://" ]) {

        return YES ;

    }    

    return NO;

}

 

 

@end


 

 

 

现在我们可以在任何的NSString类对象里都可以调用这个方法了。下面的代码在console里面打印的"string1 is a URL":

 

 

 

- (void )viewDidLoad

{

    [ super viewDidLoad];

// Do any additional setup after loading the view, typically from a nib.

 

    NSString *string1 = @"http://www.apple.com";

 

    if ([string1 isUrl ]) {

        NSLog ( @"string1 is a URL");

    }

 

    NSString *string2 = @"hahha" ;

 

    if ([string2 isUrl ]) {

        NSLog ( @"string1 is a URL");

    }

 

 

}


跟子类不一样,category不能增加成员变量。我们还可以用category来重写类原先的存在的方法,但是这需要非常非常小心。

记住,当我们通过category来修改一个类的时候,它对应用程序里的这个类所有对象都起作用。

 

 

输出结果:

 

 

string1 is a URL


分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics