Objective-c中的posing
来源:互联网 发布:mastercam新手编程 编辑:程序博客网 时间:2024/04/30 23:17
谈到这个posing,真是有些惭愧,还没了解这个是怎么回事,就已经被苹果给抹去了。
尽管如此,还是整理了一些文章,以供参考。
===================================================================
Posing,顾名思义,意思是“冒充”,它跟categories类似,但本质上不一样,Posing存在的目的在于子类可以冒充父类,使得后续的代码无需把父类修改为子类,就可以很方便的让父类表现成子类的行为,从而实现非常方便的冒充,这在一般的语言中是难以想象的。
它允许你扩展一个class,并且全面的冒充这个super class,比如:你有一个扩展NSArray的NSArrayChild对象,如果你让NSArrayChild冒充NSArray,则你程序代码所在的NSArray都会自动替换为NSArrayChild。注意,这里不是指代码替换,而是NSArray所在地方的行为都跟NSArrayChild一样了。
例子:
1,定义父类:
Fraction.h:
- #import <Foundation/NSObject.h>
- @interface Fraction : NSObject{
- int numerator;
- int denominator;
- }
- -(id)initWithNumeration:(int)a:denominator:(int) b;
- -(void) print;
- @end
Fraction.m:
- #import <stdio.h>
- #import "Fraction.h"
- @implementation Fraction
- -(id)initWithNumeration:(int)a:denominator:(int) b {
- self = [super init];
- if(self) {
- numerator = a;
- denominator = b;
- }
- return self;
- }
- -(void) print {
- printf("Fraction: %i/%i", numerator, denominator);
- }
- @end
2,定义子类:
FractionChild.h:
- #import "Fraction.h"
- @interface FractionChild : Fraction
- -(void) print;
- @end
FractionChild.m:
- #import <stdio.h>
- #import "FractionChild.h"
- @implementation FractionChild
- -(void) print {
- printf("FractionChild: %i/%i", numerator, denominator);
- }
- @end
3, 开始用FractionChild 冒充Fraction
main.m:
- #import <stdio.h>
- #import "Fraction.h"
- #import "FractionChild.h"
- int main(int agrc, const char * agrv[]) {
- Fraction *frac = [[Fraction alloc]initWithNumeration:3:denominator:4];
- [frac print]; //此时输出:Fraction: 3/4
- //make FractionChild posing as Fracition,注意:poseAsClass这个方法是NSObject的一个内置方法,用于子类posing父类。
- [FracitonChild poseAsClass [Fraction class]];
- Fraction *frac2 = [[Fraction alloc]initWithNumeration:3:denominator:4];
- [frac2 print]; //此时输出:FractionChild: 3/4,此时的Fration表现行为便被FractionChild冒充了
- [frac release];
- [frac2 release];
- }
postAsClass,32位系统中,据说还可以用;但是64位系统或者10.6.5更高的版本都不能使用了。它的作用就是使用FractionPost中的方法替代Fraction中的方法!比如,Fraction中的print方法:-(void) print {?? printf("%i/%i", numerator, denominator);}而在FractionPost中,-(void) print{?? printf("posting:%i/%i", numerator, denominator);} 这样对于Fraction对象的实例就会调用FractionPost中的方法了。当然,前提条件是FractionPost是Fraction的子类。 @interface FractionPost : Fraction { }下面要说的是,既然postAsClass不能使用了,我们用什么方法来继续使用这种功能呢? method_exchangeImplementations(originalMethod, replaceMethod); 这个运行时函数会帮助我们解决这个函数。要使用这个函数,首先导入头文件#import <objc/runtime.h> 完整的用法是:Method originalMethod = class_getInstanceMethod([Fraction class], @selector(print));Method replaceMethod = class_getInstanceMethod([FractionPost class], @selector(print));?method_exchangeImplementations(originalMethod, replaceMethod);首先获取你要替代的方法,这样做本人认为安全性也提高了,假如使用postAsClass,这样所有子类重写了的方法都会被替代。当然,安全性的提高,代价就是功能的削弱。 我相信有一定基础的人都能看懂吧,本人也还在学习基础中。更多相关Method的方法请参考官方library。
0 0
- Objective-c中的posing
- Objective-c中的posing
- Objective-C中的posing(冒充)
- objective-c posing
- Objective-C Posing
- posing
- Object-C:Posing(扮演)
- objective-c中的NSBundle
- Objective-C 中的BOOL
- Objective-c中的委托
- Objective-C中的数据类型
- Objective-C中的委托
- Objective-C中的SEL
- Objective-C中的锁
- Objective-c中的 Protocol
- Objective-C中的Block
- objective-c中的特性
- Objective-c中的委托
- ubuntu kylin14.10搭建android环境
- 【mybatis学习】maven使用mybatis-generator工具
- 闰年
- WPF——找不到资源window1.xaml
- Flexbox——快速布局神器
- Objective-c中的posing
- 加密 续
- java跳出多重嵌套循环
- java开发中jdbc连接数据库完整代码和步骤
- centOS安装
- stl set容器——ny86找球号(一)
- java process 不会关闭的解决方法
- C#处理json中的特殊符号
- Android网络检测