id类型、动态判断与选择器
2012-06-27 21:01
155 查看
1、id类型
[plain]
view plaincopyprint?
// Complex.h==============================
#import <Foundation/Foundation.h>
@interface Complex : NSObject{
double real;
double imageinary;
}
-(Complex*) initWithReal:(double) r andImageinary:(double)i;
-(void)setReal:(double) r;
-(void)setImaginary:(double) i;
-(void)setReal:(double)r andImaginary:(double) i;
-(double)real;
-(double)imaginary;
-(void)print;
@end
// Complex.h==============================
#import "Complex.h"
@implementation Complex
-(Complex*) initWithReal:(double) r andImageinary:(double)i;
{
self = [super init];
if(self){
[self setReal:r andImaginary:i];
}
return self;
}
-(void)setReal:(double) r{
real = r;
}
-(void)setImaginary:(double) i{
imaginary = i;
}
-(void)setReal:(double)r andImaginary:(double) i{
real = r;
imaginary = i;
}
-(double)real{
return real;
}
-(double)imaginary{
return imaginary;
}
-(void)print{
NSLog(@"%f + %fi",real,imaginary);
}
@end
// main.m==============================
#import "Fraction.h"
#import "Complex.h"
int main(argc,const char * argv[]){
Fracion *frac = [[Fraction alloc] intiWithNumerator:3 andDenominator:5];
Complex *comp = [[Complex alloc] initWithReal:1.5 andImaginary:3.5];
id number = frac;
[number print];
number = comp;
[comp print];
[frc release];
[comp release];
return 0;
}
[java]
view plaincopyprint?
//判断对象或类型是否有能力回应指定方法
if([squa respondsToSelector:@selector(initWithSize:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
if([MySquare respondsToSelector:@selector(alloc)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
if([rec respondsToSelector:@selector(initWithWidth:andHeight:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
//判断类产生的实例是否有能力回应指定的方法
if([MySquare instanceRespondsToSelector:@selector(initWithSize:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
if([MySquare instanceRespondsToSelector:@selector(alloc:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
//动态调用类或者对象上的一个方法
id x_id = [rec performSelector:@selector(area)];
[MyRectangle performSelector:@selector(alloc)];
[rec release];
[squa release];
注意:
类别不可以声明新的实例变量,而且一旦你定义的方法与原始类中的方法名相同,那么原始方法将被隐藏起来
因为不是继承结构,你不能在类别中的方法使用super激活原始类的同名方法
类别还有一个功能,就是隐藏方法,我们在Fraction.m的最后增加如下方法
@interface Fraction(Math3)
-(Fraction*)sub:(Fraction*)f;//减法
@end
@implementation Fraction(Math3)
-(Fraction*)sub:(Fraction*)f{
return [[Fraction alloc] initWithNumerator:
numerator*[f denominator]-denominator*[f numerator]
denominator:denominator*[f denominator]];
}
@end
在。m文件中定义@interface?是的,因为@interface一旦定义在。m文件中,它就不能以header文件形式被导入到其他的类里了,
也就是这样的@interface中定义的方法相当于隐藏了,只有zhege。m编译单元内看见
}
[plain]
view plaincopyprint?
// Complex.h==============================
#import <Foundation/Foundation.h>
@interface Complex : NSObject{
double real;
double imageinary;
}
-(Complex*) initWithReal:(double) r andImageinary:(double)i;
-(void)setReal:(double) r;
-(void)setImaginary:(double) i;
-(void)setReal:(double)r andImaginary:(double) i;
-(double)real;
-(double)imaginary;
-(void)print;
@end
// Complex.h==============================
#import "Complex.h"
@implementation Complex
-(Complex*) initWithReal:(double) r andImageinary:(double)i;
{
self = [super init];
if(self){
[self setReal:r andImaginary:i];
}
return self;
}
-(void)setReal:(double) r{
real = r;
}
-(void)setImaginary:(double) i{
imaginary = i;
}
-(void)setReal:(double)r andImaginary:(double) i{
real = r;
imaginary = i;
}
-(double)real{
return real;
}
-(double)imaginary{
return imaginary;
}
-(void)print{
NSLog(@"%f + %fi",real,imaginary);
}
@end
// main.m==============================
#import "Fraction.h"
#import "Complex.h"
int main(argc,const char * argv[]){
Fracion *frac = [[Fraction alloc] intiWithNumerator:3 andDenominator:5];
Complex *comp = [[Complex alloc] initWithReal:1.5 andImaginary:3.5];
id number = frac;
[number print];
number = comp;
[comp print];
[frc release];
[comp release];
return 0;
}
[java] view plaincopyprint? @import "MySquare.h" int main(argc,const char * argv[]){ MyRectangle *rec = [[MyRectangle alloc] initWithWidth:2 andHeight:5]; [rec area]; MySquare *squa = [[MySquare alloc] initWithSize:6]; [squa area]; //判断对象是否是clazz的实例,不包含子类的实例 if([squa isMemberOfClass:[MyRectangle class]]){ NSLog(@"squa isMemberOfClass MyRectangle."); }else{ NSLog(@"squa not isMemberOfClass MyRectangle."); } if([squa isKindOfClass:[MySquare class]]){ NSLog(@"squa isKindOfClass MySquare."); }else{ NSLog(@"squa not isKindOfClass MySquare."); } //判断对象是否是clazz的实例或者子类的实例 if([squa isKindOfClass:[MyRectangle class]]){ NSLog(@"squa isKindOfClass MyRectangle."); }else{ NSLog(@"squa not isKindOfClass MyRectangle."); } if([squa isKindOfClass:[MySquare class]]){ NSLog(@"squa isKindOfClass MySquare."); }else{ NSLog(@"squa not isKindOfClass MySquare."); } @import "MySquare.h" int main(argc,const char * argv[]){ MyRectangle *rec = [[MyRectangle alloc] initWithWidth:2 andHeight:5]; [rec area]; MySquare *squa = [[MySquare alloc] initWithSize:6]; [squa area]; //判断对象是否是clazz的实例,不包含子类的实例 if([squa isMemberOfClass:[MyRectangle class]]){ NSLog(@"squa isMemberOfClass MyRectangle."); }else{ NSLog(@"squa not isMemberOfClass MyRectangle."); } if([squa isKindOfClass:[MySquare class]]){ NSLog(@"squa isKindOfClass MySquare."); }else{ NSLog(@"squa not isKindOfClass MySquare."); } //判断对象是否是clazz的实例或者子类的实例 if([squa isKindOfClass:[MyRectangle class]]){ NSLog(@"squa isKindOfClass MyRectangle."); }else{ NSLog(@"squa not isKindOfClass MyRectangle."); } if([squa isKindOfClass:[MySquare class]]){ NSLog(@"squa isKindOfClass MySquare."); }else{ NSLog(@"squa not isKindOfClass MySquare."); }
[java]
view plaincopyprint?
//判断对象或类型是否有能力回应指定方法
if([squa respondsToSelector:@selector(initWithSize:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
if([MySquare respondsToSelector:@selector(alloc)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
if([rec respondsToSelector:@selector(initWithWidth:andHeight:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
//判断类产生的实例是否有能力回应指定的方法
if([MySquare instanceRespondsToSelector:@selector(initWithSize:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
if([MySquare instanceRespondsToSelector:@selector(alloc:)]){
NSLog(@"YES");
}else{
NSLog(@"NO");
}
//动态调用类或者对象上的一个方法
id x_id = [rec performSelector:@selector(area)];
[MyRectangle performSelector:@selector(alloc)];
[rec release];
[squa release];
[plain] view plaincopyprint? //FractionMath.h===================================== #import "Fraction.h" @interface Fraction(Math1) -(Fraction*)mul:(Fraction*)f;//乘法,就是传入一个Fraction作为参数,与当前Fraction进行计数 -(Fraction*)div:(Fraction*)f;//除法 @end @interface Fraction(Math2) -(Fraction*)add:(Fraction*)f; @end //FractionMath.m ======================================= #import "Fraction.h" @implementation Fraction(Math1) -(Fraction*)mul:(Fraction*)f{ return [[Fraction alloc] initWithNumerator:numerator *[f numerator] denominator:denominator*[f denominator]]; } -(Fraction*)div:(Fraction*)f{ return [[Fraction alloc] initWithNumerator:numerator *[f denominator] denominator:denominator*[f numerator]] } @end @implementation Fraction(Math2) -(Fraction*)add:(Fraction*)f{ return [[Fraction alloc] initWithNumerator: numerator *[f denominator] + denominator*[f numerator] denominator:denominator*[f denominator]]; } @end //main.m====================================== #import "FractionMath.h" int main(int argc,const char *argv[]){ Fraction *frac1 = [[Fraction alloc] initWithNumerator:1 denominator:3]; Fraction *frac2 = [[Fraction alloc] initWithNumerator:2 denominator:5]; Fraction *frac3 = [[frac1 mul:frac2]; [frac1 print]; NSLog(@"*"); [frac2 print]; NSLog(@"="); [frac3 print]; NSLog(@"\n"); Fration *frac5 = [frac1 add:frac2]; [frac2 print]; NSLog(@"+"); [frac2 print]; NSLog(@"="); [frac2 print]; NSLog(@"\n"); [frac1 release]; [frac2 release]; [frac3 release]; [frac5 release]; return 0; } //FractionMath.h===================================== #import "Fraction.h" @interface Fraction(Math1) -(Fraction*)mul:(Fraction*)f;//乘法,就是传入一个Fraction作为参数,与当前Fraction进行计数 -(Fraction*)div:(Fraction*)f;//除法 @end @interface Fraction(Math2) -(Fraction*)add:(Fraction*)f; @end //FractionMath.m ======================================= #import "Fraction.h" @implementation Fraction(Math1) -(Fraction*)mul:(Fraction*)f{ return [[Fraction alloc] initWithNumerator:numerator *[f numerator] denominator:denominator*[f denominator]]; } -(Fraction*)div:(Fraction*)f{ return [[Fraction alloc] initWithNumerator:numerator *[f denominator] denominator:denominator*[f numerator]] } @end @implementation Fraction(Math2) -(Fraction*)add:(Fraction*)f{ return [[Fraction alloc] initWithNumerator: numerator *[f denominator] + denominator*[f numerator] denominator:denominator*[f denominator]]; } @end //main.m====================================== #import "FractionMath.h" int main(int argc,const char *argv[]){ Fraction *frac1 = [[Fraction alloc] initWithNumerator:1 denominator:3]; Fraction *frac2 = [[Fraction alloc] initWithNumerator:2 denominator:5]; Fraction *frac3 = [[frac1 mul:frac2]; [frac1 print]; NSLog(@"*"); [frac2 print]; NSLog(@"="); [frac3 print]; NSLog(@"\n"); Fration *frac5 = [frac1 add:frac2]; [frac2 print]; NSLog(@"+"); [frac2 print]; NSLog(@"="); [frac2 print]; NSLog(@"\n"); [frac1 release]; [frac2 release]; [frac3 release]; [frac5 release]; return 0; }
注意:
类别不可以声明新的实例变量,而且一旦你定义的方法与原始类中的方法名相同,那么原始方法将被隐藏起来
因为不是继承结构,你不能在类别中的方法使用super激活原始类的同名方法
类别还有一个功能,就是隐藏方法,我们在Fraction.m的最后增加如下方法
@interface Fraction(Math3)
-(Fraction*)sub:(Fraction*)f;//减法
@end
@implementation Fraction(Math3)
-(Fraction*)sub:(Fraction*)f{
return [[Fraction alloc] initWithNumerator:
numerator*[f denominator]-denominator*[f numerator]
denominator:denominator*[f denominator]];
}
@end
在。m文件中定义@interface?是的,因为@interface一旦定义在。m文件中,它就不能以header文件形式被导入到其他的类里了,
也就是这样的@interface中定义的方法相当于隐藏了,只有zhege。m编译单元内看见
}
相关文章推荐
- LHF Objective-C语法(7)id类型、动态判断与选择器
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- 动态类型判断...| -isKindOfClass: -isMemberOfClass: +isSubclassOfClass
- 根据动态id判断checkBox是否被选中
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等NSClassFromString
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- 简要讲解CSS中的类型选择器、ID选择器、类选择器
- Object-C之动态类型(isKindOfClass, isMemberOfClass,id)等
- c++ 动态判断基类指针指向的子类类型(typeid)
- jquery选择器--给id为动态的值得元素赋值
- 二十九、多态性、动态类型 和 动态绑定(二)动态绑定 和 id类型
- Objective-C 的动态类型判断
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- iOS开发之----动态类型(isKindOfClass, isMemberOfClass,id)等
- 三十一、多态性、动态类型 和 动态绑定(四)id类型 和 静态类型
- 6,Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Objective-C语法之动态类型(isKindOfClass, isMemberOfClass,id)等
- Object C学习笔记17-动态判断和选择器
- 五.OC基础--1.多态,2.类对象,3.点语法,4.@property&@synthesize,5.动态类型,内省(判断对象是否遵循特定的协议,以及是否可以响应特定的消息)