我们知道对于现如今的动态语言比如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


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

obj-c编程06:反射与元编程初步的更多相关文章

  1. C++模板元编程(C++ template metaprogramming)

    实验平台:Win7,VS2013 Community,GCC 4.8.3(在线版) 所谓元编程就是编写直接生成或操纵程序的程序,C++ 模板给 C++ 语言提供了元编程的能力,模板使 C++ 编程变得 ...

  2. Python的元编程案例

    Python的元编程案例 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.什么是元编程 元编程概念来自LISP和smalltalk. 我们写程序是直接写代码,是否能够用代码来生成 ...

  3. C++ 元编程 —— 让编译器帮你写程序

    目录 1 C++ 中的元编程 1.1 什么是元编程 1.2 元编程在 C++ 中的位置 1.3 C++ 元编程的历史 2 元编程的语言支持 2.1 C++ 中的模板类型 2.2 C++ 中的模板参数 ...

  4. C++ 模板元编程 学习笔记

    https://blog.csdn.net/K346K346/article/details/82748163 https://www.jianshu.com/p/b56d59f77d53 https ...

  5. 201706 Ruby 基础 & 元编程

    yield yield self Proc yield带参数 rails中:yield 和 content_for methods.proc.lambda.block 闭包(用proc延长变量的生命周 ...

  6. 现代c++模板元编程:遍历tuple

    tuple是c++11新增的数据结构,通过tuple我们可以方便地把各种不同类型的数据组合在一起.有了这样的数据结构我们就可以轻松模拟多值返回等技巧了. tuple和其他的容器不同,标准库没有提供适用 ...

  7. Groovy元编程简明教程

    同函数式编程类似,元编程,看上去像一门独派武学. 在 <Ruby元编程>一书中,定义:元编程是运行时操作语言构件的编程能力.其中,语言构件指模块.类.方法.变量等.常用的主要是动态创建和访 ...

  8. .Net元编程【Metaprogramming in NET】 序-翻译

    最近在看这本书,比较实用.抽点时间把公开的部分内容简单的翻译了一下,下文是序部分. 书的具体地址为: http://www.amazon.cn/Metaprogramming-in-NET-Hazza ...

  9. atitit.元编程总结 o99

    atitit.元编程总结 o99.doc 1. 元编程(Metaprogramming) 1 2. 元编程的历史and发展 1 3. 元类型and元数据 1 4. 元编程实现方式 2 4.1. 代码生 ...

随机推荐

  1. TraceView性能分析工具介绍

    一.TraceView简介 TraceView是AndroidSDK里面自带的工具,用于对Android的应用程序以及Framework层的代码进行性能分析. TraceView是图形化的工具,最终它 ...

  2. antlr v4 使用指南连载4——词法规则入门之黄金定律

    词法规则入门 黄金定律一二 若输入串能被多个词法规则匹配,那么声明在词法文件最前面的规则生效. parser parser grammar HelloParser; options { languag ...

  3. Dynamics CRM 安装Microsoft Dynamics CRM Reporting Extensions

    在装完CRM Server 后这个组件是必须安装的,但今天由于我的大意在客户安装生产环境时,告诉客户这个组件装在APP服务器上,导致客户安装时 SSRSInstance怎么都是空的,害的人家找了半天原 ...

  4. JS和Jquery操作label标签

    获取label值:  label标签在JS和Jquery中使用不能像其他标签一样用value获取它的值: 代码如下: var label=document.getElementById("s ...

  5. UNIX网络编程——TCP—经受时延与nagle算法、滑动窗口、拥塞窗口

    1.经受时延: TCP在接收到数据时并不立即发送ACK,相反,它推迟发送,以便将ACK与需要沿该方向发送的数据一起发送,时延为200ms,超过时延范围,发送确认. 2.nagle算法: 一个TCP连接 ...

  6. Android:android sdk源码中怎么没有httpclient的源码了

    欢迎关注公众号,每天推送Android技术文章,二维码如下:(可扫描) 今天想使用这个API,怎么也找不到.废了好多时间... 查阅资料才知道如下解释: 在android 6.0(API 23)中,G ...

  7. 秒懂ASP.NET中的内置对象

    上篇博客,小编主要简单的介绍了一下ASP.NET中的控件,这篇博客,小编主要简单总结一下ASP.NET中的内置对象,七个内置对象分别是:Request.Response.Application.Coo ...

  8. IE浏览器打印的页眉页脚设置解决方法

    首先说明问题: 默认情况下,通过IE的打印对话框,打印出来的内容都有页眉和页脚的. 查看ie的页面设置发现如右图中,页眉页脚 下面先说明&w&bPage&p of &P ...

  9. iOS中类单例方法的一种实现

    在Cocos2D编程中,很多情况我们需要类只生成一个实例,这称之为该类的单例类. 一般我们在类中这样实现单例方法: +(instancetype)sharedInstance{ static Foo ...

  10. 分布式进阶(五)之JSVC配置

    应用场景:在linux系统上进行项目开发,在部署java项目时,常用方法就是写一个shell脚本,但当服务器重启了,经常会忘了启动shell脚本了.所以我们需要把自己的应用变成linux的服务,当服务 ...