Object-C中分类

Object-C中分类,第1张

概述什么是 objective-c 的分类? 有的时候,我们需要对原有的类添加一些功能(方法)作为源类扩展,他的功能是扩展类的能力。 分类需要注意的地方: 1:尽管分类可以访问原始类的实例变量,但是他不能添加自身的任何变量,如果需要添加变量,可以考虑创建子类。 2:分类可以重载该类的另一个方法,但是通常认为这种做法是卑劣的设计习惯。第一:重载一个方法后,再也不能访问原来的方法,因此,必须小心将被重载方

什么是 objective-c 的分类?

有的时候,我们需要对原有的类添加一些功能(方法)作为源类扩展,他的功能是扩展类的能力。

分类需要注意的地方:

1:尽管分类可以访问原始类的实例变量,但是他不能添加自身的任何变量,如果需要添加变量,可以考虑创建子类。

2:分类可以重载该类的另一个方法,但是通常认为这种做法是卑劣的设计习惯。第一:重载一个方法后,再也不能访问原来的方法,因此,必须小心将被重载方法中的所有功能复制到替换方法中,如果确实需要重载方法,可以考虑常见子类,如果在子类中重载方法,仍然可以通过想super发送消息类来引用父类的方法。因此不必了解重载方法的内容就能够调用父类的方法,并向子类的方法添加自己的功能。

3:一个类,可以拥有多个分类

4:和一般接口不同的是,不必实现分类所有的方法,这个对程序的扩展很有用,因为可以在该类分类的声明所有的方法,然后在一段时间后在来是实现他。

5:记住,通过分类添加新的方法来扩展该类,不仅仅会影响该类,还会影响该类所有的子类,因此他的所有的子类都会继承这个分类,而不管这些子类愿意不愿意。

通过分类的方式可以为已存在的类添加新的方法,甚至不需要源码,有点像C#中的扩展方法。

这时提供一个例子是把一个字符串转换为驼峰式并且出掉单词空格。

首先编写头Nsstring+CamelCase.h

#import <Foundation/Foundation.h>
  //Nsstring 表示将要添加分类的类名称,该类必须是已存在的。 //CamelCase 是为类添加的分类的名称。 //只能添加方法,不能添加变量。 //头文件命名惯例:Classname+categoryname.h @interface Nsstring (CamelCase) -(Nsstring*) camelCaseString; @end

接着编写实现文件Nsstring+CamelCase.m

#import "Nsstring+CamelCase.h" @implementation *) camelCaseString {     //调用Nsstring的内部方法获取驼峰字符串。 //self指向被添加分类的类。     *castr = [self cAPItalizedString];       //创建数组来过滤掉空格,通过分隔符对字符进行组合。 NSArray *array = [castr componentsSeparatedByCharactersInSet:                       [NSCharacterSet whitespaceCharacterSet]]; //把数组的字符输出 *output = @""; for(*word in array)             output = [output stringByAppendingString:word]; }       return output;   最后编写测试文件main.m

#import "Nsstring+CamelCase.h"//添加该类 int main (argc, const char * argv[]) { NSautoreleasePool * pool = [[alloc] init]; *str = @"My name is bill."; NSLog(@"%@",str); str = [str camelCaseString]; [pool drain]; 0; }

下面是另外一个例子,可以很好的解释分类的用处: student.m

@H_692_419@#import <Foundation/Foundation.h>

 

@interface student : NSObject 

{

Nsstring *name;

}

-(voID)setname:(Nsstring *)_name;

-(Nsstring *)name;

-(voID)printValue;

@end

studeng.m #import "student.h"

@implementation student

-(voID)setname:(Nsstring *)_name

{

name = _name;

}

 

-(Nsstring *)name

{

return name;

voID)printValue

NSLog(self.name,nil);

}

@end

studentExt.h

 

#import "student.h"

 

@interface student (extSt)

 

-(voID)printValueExt;

-(voID)printValue;

 

@end

studentExt.m #import "studentExt.h"

 

 

@implementation student (extSt)

 

-(voID)printValueExt

NSLog(@"这个是类扩展后添加的方法!");

}

 

-(voID)printValue

@"这个是重载后的函数的处理的结果! }

 

 下面的调用的函数 #import <Foundation/Foundation.h>

#import "studentExt.h"

int main (int argc, const char * argv[]) 

    NSautoreleasePool * pool = [[NSautoreleasePool allocinit];

/////////////////////

student *stu = [[[ allocinitautorelease];

[stu setname:@"this is orign nameStr"];

[stu printValue];

[stu printValueExt/////////////////////

[pool drain];

    return 0;

}

上面的代码基本上说明了,分类的作用,你懂的哦。。 总结: 关于分类,我感觉使用在扩展那些你无法看到类的实现代码的类的,你可以为这些类添加扩展函数,可以重载源类中的成员函数,来满足自己的实际需求,但是对于那些你可以看到类的实现、访问的类来说,你则完全没有必要写分类。另外对于那些需要分工合作的工作,也是适合写分类的地方。 另外一点也是需要注意的是: 如果你用分类的方式重载了Cocoa类,那么你的App就有可能同不过苹果的作品审核,因为苹果对这些自定义的修改的要求是极其严格,甚至说是苛刻的。 因此,不建议使用objective-c语言的分类。 总结

以上是内存溢出为你收集整理的Object-C中分类全部内容,希望文章能够帮你解决Object-C中分类所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1053023.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-25
下一篇 2022-05-25

发表评论

登录后才能评论

评论列表(0条)

保存