<拦截方法> Objective-C使用Category
2013-03-30 18:55
609 查看
<Smking>通过Category定义与该类本身的方法名相同时,Category方法会优先于它自身的方法,所以如果在Category中实现了init方法,并且直接返回为nil,则会使得所有使用这个类init的对象都会因为Category的方法而返回为nil.<根据这个原理可以考虑一下,如何拦截已有的方法,使之不可用,当然如果有办法能遍历出所给对象的所有可支持方法就更利于这个使用了。有空可以深入研究一下。>Category是ObjC语言中的扩展机制之一,另一个为Protocol。Category提供一种为某个类添加方法而又不必编写子类的途径。假设有这样一个类CarInfo:#import<Foundation/Foundation.h>
@interfaceCarInfo:NSObject{
}
-(void)sayCarBrand;
@end
@implementationCarInfo
-(void)sayCarBrand{
NSLog(@"Carbrand:Golf");
}
@end
我可以用Category为该类增加新的方法:#import<Foundation/Foundation.h>
#import"CarInfo.h"
@interfaceCarInfo(CarInfoCategory)
-(void)sayCarBrandChinese;
@end
@implementationCarInfo(CarInfoCategory)
-(void)sayCarBrandChinese{
NSLog(@"汽车品牌:高尔夫");
}
@end
这里的Category增加了一个新的方法,用来显示汉字名称。可在其他代码中直接调用,就如同调用CarInfo其他实例方法一样:CarInfo*carInfo=[[CarInfoalloc]init];
[carInfosayCarBrandChinese];
这种效果是Java做不到的。这得益于ObjC语言方法调度程序这一特殊机制。如果方法名称相同会怎样?比如:#import<Foundation/Foundation.h>
#import"CarInfo.h"
@interfaceCarInfo(CarInfoCategory)
-(void)sayCarBrand;
@end
@implementationCarInfo(CarInfoCategory)
-(void)sayCarBrand{
NSLog(@"汽车品牌:高尔夫");
}
@end
再次调用:CarInfo*carInfo=[[CarInfoalloc]init];
[carInfosayCarBrand];
会发现,打印的是category中的方法,而不是类的实例方法。因为category优先于类实例方法。那么是否有这样的能力,比如在category的方法内代码中调用类的实例方法,这样不就可以实现类似Java方法拦截器的功能了么?或者说是方法代理模式。遗憾的是,这样不可以。
#import<Foundation/Foundation.h> @interfaceCarInfo:NSObject{ } -(void)sayCarBrand; @end @implementationCarInfo -(void)sayCarBrand{ NSLog(@"Carbrand:Golf"); } @end |
#import<Foundation/Foundation.h> #import"CarInfo.h" @interfaceCarInfo(CarInfoCategory) -(void)sayCarBrandChinese; @end @implementationCarInfo(CarInfoCategory) -(void)sayCarBrandChinese{ NSLog(@"汽车品牌:高尔夫"); } @end |
CarInfo*carInfo=[[CarInfoalloc]init]; [carInfosayCarBrandChinese]; |
#import<Foundation/Foundation.h> #import"CarInfo.h" @interfaceCarInfo(CarInfoCategory) -(void)sayCarBrand; @end @implementationCarInfo(CarInfoCategory) -(void)sayCarBrand{ NSLog(@"汽车品牌:高尔夫"); } @end |
CarInfo*carInfo=[[CarInfoalloc]init]; [carInfosayCarBrand]; |
相关文章推荐
- HTML中让图片滚动的<marquee>标签的使用方法
- 使用<jsp:include>,不想写死URL,动态生成URL的解决的方法
- JSP 中使用<%@include%> 报 Duplicate local variable path 错误的解决方法
- <拦截>所有调用某方法的地方--黑魔法
- 使用struts2的<s:param>等标签向action传值出现中文乱码的解决方法
- <转>云主机配置OpenStack使用spice的方法
- JSP 使用<%@include%>报Duplicate local variable path 错误 解决方法
- <转载>WdatePicker日历控件使用方法
- JSONP一种使用<script>元素获取数据的方法
- <s:iterator> 中的status 使用方法
- Spring配置文件中使用ref local与ref bean的区别. 在ApplicationResources.properties文件中,使用<ref bean>与<ref local>方法如下
- AJAX跨域方法之一—使用<script>实现
- 关于spring切面使用<aop:aspectj-autoproxy/>报错的解决方法
- 在eclipse中运行工程时 出现<ConnectionProperties> <PropertyCategory name="Connection/Authentication">的解决方法
- <s:iterator> 中的status 使用方法
- <Android 开源库> GreenDAO 使用方法具体解释<译文>
- 使用<a>标签提交action会执行两次后台方法的原因(反射机制小实例问题的解决)
- <配置> Ubuntu gcc 安装 使用方法
- C#List<Category>使用方法
- <s:iterator> 中的status 使用方法