閱讀592 返回首頁    go 阿裏雲 go 技術社區[雲棲]


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



很明顯沒有執行方法!為啥呢,不知道啊!

最後更新:2017-04-03 06:03:10

  上一篇:go aspx 頁麵間傳值
  下一篇:go Swift方法