Ryan的OC学习总结-----4 类别与扩展
来源:互联网 发布:因windows system32 编辑:程序博客网 时间:2024/05/11 03:43
一 类别Category
一个需求:
如果想让字符串类NSString具有解析JSON字符串的能力,我们可以通过继承机制实现,但是NSString是一个庞大的类,继承实现时很困难的。实际上很多类是不能被继承的。
利用OC的动态语言的特点,在不需要使用子类机制情况下,就可以为现有类添加新的方法,这就是类别caegory机制。
既然数据类型可以使动态识别,方法也可以动态识别,这就是“动态绑定”,它是指在执行期间根据“消息”找出要调用的实际方法。类别category就是动态绑定。
类别category允许向一个类文件添加新的方法声明,它不需要使用子类机制。其语法如下:
@interface 原始类型(类别名)
//方法声明
@end
#import "ClassName.h"@interface ClassName(CategoryName)//方法声明@end
示例1:
//NSString+JSON.h@interface NSString (JSON)+(id)decodeJSON:(NSString *) jsonStr;@end//NSString+JSON.m#import "NSSTring+JSON.h"@implementation NSString (JSON)+(id)decodeJSON : (NSSting *) jsonStr{ ...... return jsonObj;}@end//main#import "NSString+JSON.h"#define JSON_STR @"{\"ID\":\"1\",\"UserID\":\"tony\"}"int main (int argc, const char *argv[]){ id isonObj = [NSString decodeJSON:JSON_STR]; NSLog(@"Json Obj = %@", jsonObj); return 0;}
示例2:
//NSNumber_Message.h@interface NSNumber (Message)-(NSString *)errorMessage;@end//NSNumber+Message.m@implementation NSNmber (Message)-(NSString *)errorMEssage{ NSString *errorStr = @""; switch([self integerValue]){ case -7: errorStr = @"没有数据!"; break; ........... case -1: errorStr = @"用户不存在,请到51work6.com注册"; break; default: break; } return errorStr;}@end//main#import <Foundation/Foundation.h>#import "NSNumber+Message.h"int main(int argc, const char *argv[]){ NSNumber* errorCode = [[NSNumber alloc] initWithInteger:-1]; NSString* errorMessage = [errorCode errorMessage]; MSLog(@"ErrorMessage = %@", errorMessage); return 0;}
类别的缺陷:
无法想类别中添加实例变量。
类别中方法名与原始类中方法名相同时,类别中方法会取代原始类中方法。
二 扩展Extension
传统的OC语言诟病:隐藏类的nebula细节能力不强;h文件包含太多信息,所有实例变量(隐藏的除外)、属性和方法都必须在h文件声明。
类扩展(extension)是一种匿名类别,没有名字只有(),扩展中包含一组私有实例变量、属性和方法声明,扩展应该放在类实现文件中,@implementation指令之前。
示例:
//ViewController.h#import <UIKit/UIKit.h>#interface ViewController : UIViewController //公有方法 属性 实例变量声明@end//ViewController.m@import "ViewController.h"@interface ViewController() //ViewController的扩展,私有变量 属性 方法声明-(IBAction)onClick:(id)sender;@property (weak, nonatomic) IBOutlet UILable *lable;@end@implementation ViewController- (void)viewDidLoad{ [super viewDidLoad];}- (void)didReceiveMemoryWarning{ [super didReceiveMemoryWarning];}- (IBAction)onClick:(id)sender{ self.lable.text = @"HelloWorld";}@end
0 0
- Ryan的OC学习总结-----4 类别与扩展
- Ryan的OC学习总结-----3 继承与多态
- Ryan的OC学习总结-----5 协议
- Ryan的OC学习总结-----6 块
- Ryan的OC学习总结-----1 第一个OC程序
- Ryan的OC学习总结-----8 OC编码规范
- OC-类别与扩展
- Ryan的OC学习总结-----7 内存管理
- Ryan的OC学习总结-----9 Foundation框架
- oc 类别 与 类扩展
- Ryan的OC学习总结-----2 OC中的面向对象特性
- 【IOS 开发学习总结-OC-19】★★objective-c面向对象之——类别与扩展
- 学习笔记----OC 中类别 扩展
- OC中类别、扩展、协议与委托
- OC中类别、扩展、协议与委托
- OC中的类别、类扩展与协议
- OC学习之道:OC中类别--Category类目的使用/Eetension类的扩展 的使用
- 16、OC 类别(category)与扩展(extension)
- Java基础之List--常用集合
- 15.8节练习
- UIAutomation使用简要介绍
- springMVC3学习(七)--Interceptor拦截器
- adb 端口被劫持
- Ryan的OC学习总结-----4 类别与扩展
- [MDM-1] - About Mobile Device Management - Yingyong Mao
- springMVC3学习(八)--全局的异常处理
- js中直接使用el表达式
- adb 常用命令
- unity手游<少侠历险记>(2)人物攻击动画判定和怪物AI
- HDOJ 5256 序列变换
- 【最短系列】template模板
- JAVA动态编译