obj-c编程06:反射与元编程初步

简介:

    我们知道对于现如今的动态语言比如ruby而言,反射和元编程以及支持的非常灵活了,你完全可以跳过常规的手段,而利用反射来查询或调用对象的私有方法。而obj-c对反射的支持略显小繁琐,而且在开了ARC后同样出错。就算不开ARC,为啥明明有那个方法却不能调用呢?为啥double变量不让直接转成id呢?蛋疼啊,上代码:

#import <Foundation/Foundation.h>

@interface A:NSObject{
	double i;
}
	@property double i;
	-(double)mul:(double)x;
	-(void)show;
@end

@implementation A
	@synthesize i;

	-(double)mul:(double)x{
		return i * x;
	}

	-(void)show{
		NSLog(@"[A obj]i : %f",i);
	}
@end

@interface B:NSObject{
	int i;
}
	@property int i;

	-(int)mul:(int)x;
	-(void)show;
@end

@implementation B
	@synthesize i;

	-(int)mul:(int)x{
		return i * x;
	}

	-(void)show{
		NSLog(@"[B obj]i : %d",i);
	}
@end

int main(int argc,char *argv[])
{
	@autoreleasepool{
		NSLog(@"hello obj-c!");

		id obj = [[A alloc] init];
		if([obj respondsToSelector: @selector(setI:)])
			[obj performSelector: @selector(setI:) withObject:(id)(int)99.99];

		[obj show]; //why show can exec???

		SEL action_mul = @selector(mul);
		SEL action_i = @selector(i);
		if([obj respondsToSelector: action_mul] && [obj respondsToSelector: action_i])
			NSLog(@"%f * %f is %f",[obj respondsToSelector :action_i],99.99,[obj respondsToSelector: action_mul]);
	}
	return 0;
}

不能开ARC,编译运行如下:

apple@kissAir: objc_src$clang -framework Foundation 2.m -o 2

2.m:58:27: warning: format specifies type 'double' but the argument has type

      'BOOL' (aka 'signed char') [-Wformat]

  ...NSLog(@"%f * %f is %f",[obj respondsToSelector :action_i],99.99,[obj resp...

             ~~             ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

             %hhd

2.m:58:68: warning: format specifies type 'double' but the argument has type

      'BOOL' (aka 'signed char') [-Wformat]

  ...%f",[obj respondsToSelector :action_i],99.99,[obj respondsToSelector: action_mul]);

     ~~                                           ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

     %hhd

2 warnings generated.

apple@kissAir: objc_src$./2

2014-06-30 09:27:33.968 2[1010:507] hello obj-c!

2014-06-30 09:27:33.970 2[1010:507] [A obj]i : 0.000000



很明显没有执行方法!为啥呢,不知道啊!

相关文章
|
Java
反射的用法以及介绍
反射的用法以及介绍
68 0
|
5月前
|
C# 图形学 数据安全/隐私保护
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
Unity数据加密☀️反射的用法:变量、属性、方法、重载,反射在DLL中的使用方法
|
存储 算法 安全
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
复习`C++核心语法`,且适当进行汇编探索底层实现原理,进一步夯实基础,为以后的`底层开发`、`音视频开发`、`跨平台开发`、`算法`等方向的进一步学习埋下伏笔。
04-📝C++核心语法|面向对象2【友元、内部类与局部类、强化训练(数组类封装)、运算符重载、仿函数、模板、类型转换、 C++标准、错误&&异常、智能指针】
|
8月前
|
设计模式 Java Python
python内置方法和属性应用:反射和单例
python除了丰富的第三方库外,本身也提供了一些内在的方法和底层的一些属性,大家比较常用的如dict、list、set、min、max、range、sorted等。笔者最近在做项目框架时涉及到一些不是很常用的方法和属性,在本文中和大家做下分享【2月更文挑战第2天】
75 0
|
8月前
|
Java
Java面向对象编程,构造函数和方法的区别是什么?
Java面向对象编程,构造函数和方法的区别是什么?
139 2
|
XML 安全 Java
教你精通Java语法之第十三章、反射
Java的反射(reflection)机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法;对于任意一个对象,都能够调用它的任意方法和属性,既然能拿到,那么,我们就可以修改部分类型信息;这种动态获取信息以及动态调用对象方法的功能称为java语言的反射(reflection)机制。1. 反射的意义2. 反射重要的几个类: Class类 、Field类、 Method类、 Constructor类3. 学会合理利用反射,一定要在安全环境下使用。
76 0
|
JSON 前端开发 Go
GO语言-09通过例子了解通过反射进行实例化
GO语言的学习与记录,第九篇:通过一个例子了解通过反射进行实例化。内容用到了接口、结构体和JSON互转、反射的类型和实例化的内容
170 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
175 0
【Groovy】MOP 元对象协议与元编程 ( 使用 Groovy 元编程进行函数拦截 | 通过 MetaClass#invokeMethod 方法调用类其它方法 )
|
C#
改善C#程序的157个建议——建议33学习笔记:避免在泛型类型中声明静态成员
改善C#程序的157个建议——建议33学习笔记:避免在泛型类型中声明静态成员
164 0