说实在的,写这第5篇的时候十分纠结,代码老是不能动态绑定,在编译时就会出错,最后发现这是开了ARC的原因。开了ARC obj-c就不能动态绑定了吗?这个问题还不清楚哦。把ARC关闭后,虽然会有警告,但运行是正确的。下面上代码:

#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!");

		//A *a = [[A alloc] init];
		//id obj = a;
		id obj = [[A alloc] init];
		[obj setI:123.123];
		//[obj mul:123];
		[obj show];
		NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);
	}
	return 0;
}

这是开了ARC之后的编译,无法动态绑定鸟:

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

2.m:52:3: error: multiple methods named 'setI:' found with mismatched result,

parameter type or attributes

[obj setI:123.123];

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

2.m:6:19: note:
one possibility

@property double i;

^

2.m:26:16: note: also found

@property int i;

^

2.m:55:26: error: multiple methods named 'i' found with mismatched result,

parameter type or attributes

NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);

^~~~~~~

2.m:6:19: note:
one possibility

@property double i;

^

2.m:26:16: note: also found

@property int i;

^

2.m:55:40: error: multiple methods named 'mul:' found with mismatched result,

parameter type or attributes

NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);

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

2.m:7:2: note:
one possibility

-(double)mul:(double)x;

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

2.m:28:2: note:
also found

-(int)mul:(int)x;

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

3 errors generated.


这是关了ARC之后的编译和运行:

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

2.m:52:3: warning: multiple methods named 'setI:' found

[obj setI:123.123];

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

2.m:6:19: note: using

@property double i;

^

2.m:26:16: note: also found

@property int i;

^

2.m:55:26: warning: multiple methods named 'i' found

NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);

^~~~~~~

2.m:6:19: note: using

@property double i;

^

2.m:26:16: note: also found

@property int i;

^

2.m:55:40: warning: multiple methods named 'mul:' found

NSLog(@"%f * %f is %f",[obj i],99.99,[obj mul:99.99]);

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

2.m:7:2: note: using

-(double)mul:(double)x;

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

2.m:28:2: note:
also found

-(int)mul:(int)x;

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

3 warnings generated.

apple@kissAir: objc_src$./2

2014-06-30 08:51:28.972 2[828:507] hello obj-c!

2014-06-30 08:51:28.974 2[828:507] [A obj]i : 123.123000

2014-06-30 08:51:28.974 2[828:507] 123.123000 * 99.990000 is 12311.068770

这个问题还没得到解决,希望哪位高人给予解答一下,在这之前我先跳过往后学鸟,毕竟时间不等笨猫啊!

[2014-07-05 第1次新增]:多态的第二个例子

我们来看看一个简单的代码,其正确实现了对象的多态功能,虽然编译时会有警告:

int main(int argc, char *argv[]){
	@autoreleasepool {
		msg(@"Hello World!");
		NSString *str = @"hello apple";
		NSObject *obj = str;
		id item = str;

		msg(@"%lu %lu",[obj length],[item length]);
	}
	return 0;
}

编译运行如下:

wisy@wisy-ThinkPad-X61:~/src/objc_src$ clang -objc-arc -O3 -g0 $OBJC_OPTS -lobjc -lgnustep-base -o 1 1.m
1.m:12:23: warning: 'NSObject' may not respond to 'length'
                msg(@"%lu %lu",[obj length],[item length]);
                                ~~~ ^
1.m:3:24: note: expanded from macro 'msg'
#define msg(...) NSLog(__VA_ARGS__)
                       ^
1 warning generated.
wisy@wisy-ThinkPad-X61:~/src/objc_src$ ./1
2014-07-05 09:45:58.092 1[3309] Hello World!
2014-07-05 09:45:58.095 1[3309] 11 11

前面一个问题答案貌似也清楚了,类B没有从A继承啊!你从NSObject继承,当运行时动态绑定的对象自然不知道到底是调用A还是B对象的方法鸟.

obj-c编程05:类的多态与id动态绑定的更多相关文章

  1. 第三章:Python高级编程-深入类和对象

    第三章:Python高级编程-深入类和对象 Python3高级核心技术97讲 笔记 3.1 鸭子类型和多态 """ 当看到一直鸟走起来像鸭子.游泳起来像鸭子.叫起来像鸭子 ...

  2. 并发编程 05—— Callable和Future

    Java并发编程实践 目录 并发编程 01—— ThreadLocal 并发编程 02—— ConcurrentHashMap 并发编程 03—— 阻塞队列和生产者-消费者模式 并发编程 04—— 闭 ...

  3. C# 类的多态、结构、接口、抽象、虚函数总结

    多态: 类的多态是通过在子类(派生类)中重载基类的虚方法或成员函数来实现的. 可见,重载和虚函数的重写,并在调用时用父类装箱子类对象,是实现多态的一种重要的编程方式. 接口: 接口是一种用来定义程序的 ...

  4. day21-5 类的多态与多态性

    类的多态与多态性 多态 多态指的是一类事物有多种形态,如动物有多种形态:人.狗.猪 import abc class Animal(metaclass=abc.ABCMeta): # 同一类事物:动物 ...

  5. Python全栈开发之7、面向对象编程进阶-类属性和方法、异常处理和反射

    一.类的属性 1.@property属性 作用就是通过@property把一个方法变成一个静态属性 class Room: def __init__(self,name,length,width,he ...

  6. day18-Python运维开发基础(单继承 / 多继承 / 菱形继承、类的多态)

    1. 单继承 / 多继承 / 菱形继承 # ### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 """ 一个类可以继承另外一个类,那 ...

  7. Python类的多态的例子

    1 # -*- coding: utf-8 -*- 2 # 类的多态 3 4 # 定义Person父类 5 class Person(object): 6 def __init__(self, nam ...

  8. 第二十九节:Java基础知识-类,多态,Object,数组和字符串

    前言 Java基础知识-类,多态,Object,数组和字符串,回顾,继承,类的多态性,多态,向上转型和向下转型,Object,数组,多维数组,字符串,字符串比较. 回顾 类的定义格式: [类的修饰符] ...

  9. Python 类的多态的运用

    #类的多态的运用 #汽车类 class Car(object): def move(self): print("move ...") #汽车商店类 class CarStore(o ...

随机推荐

  1. Android简易实战教程--第二十五话《网络图片查看器》

    访问网络已经有了很成熟的框架.这一篇只是介绍一下HttpURLConnection的简单用法,以及里面的"注意点".这一篇可以复习或者学习HttpURLConnection.han ...

  2. openfire环境搭建

    1.下载源代码:http://www.igniterealtime.org/downloads/source.jsp 2.把源代码解压出的openfire_src文件夹放至eclipse workpl ...

  3. Github Pages 搭建HEXO主题个人博客

    跌跌撞撞,总算是建立起来了.回首走过的这么多坑,也真的是蛮不容易的.那么就写点东西,记录我是怎么搭建的吧. 准备工作 安装Node.js: 用于生成静态页面,我们需要到官网上去下载即可.http:// ...

  4. Python模块探秘 Smtplib发送带有各种附件的邮件

    这两天对Python的邮件模块比较感兴趣,于是就查了查资料.同时在实际的编码过程中也遇到了各种各样的问题.下面我就来分享一下我与smtplib的故事. 前提条件 我的上一篇博文里面讲解了,发送邮件必须 ...

  5. Dynamics CRM2015 The plug-in type does not exist in the specified assembly问题的解决方法

    在用插件工具PluginProfiler调试时,报"The plug-in type  xxxx  does not exist in the specified assembly" ...

  6. LCD 显示异常定位分析方法

    第一种情况: 进入kernel或android 后,如果LCM图像示异常,可以通过如下步骤来判断问题出现在哪个层面. step1:通过DMMS截图,来判断上面刷到LCM的数据是否有问题. 若DMMS获 ...

  7. smack4中文文档

    smack4中文文档 基于samck官方最新文档翻译而成,适用于最新的Smack4.x 简介 6月毕业后来到帝都上班,找了一份Android开发的工作,公司开发的APP需要使用XMPP和Smack进行 ...

  8. Android的stateListDrawable,layerDawable,clipdrawable,AnimationDarwable介绍-android学习之旅(五十五)

    StatelistDrawable资源 代码示例 <?xml version="1.0" encoding="utf-8"?> <select ...

  9. 【一天一道LeetCode】#117. Populating Next Right Pointers in Each Node II

    一天一道LeetCode 本系列文章已全部上传至我的github,地址:ZeeCoder's Github 欢迎大家关注我的新浪微博,我的新浪微博 欢迎转载,转载请注明出处 (一)题目 Follow ...

  10. Unity插件 - MeshEditor(二) 模型网格编辑器(高级)

    源码已上传至github,并持续更新,链接请看底部.(本帖跟随github持续更新) 继先前的一篇MeshEditor之后,MeshEditor第二版发布,这次在先前的基础上加入了为模型新增顶点以及删 ...