作者wemee (我不为读者改变作风)
看板MacDev
标题[问题] 请问如何做动态系结
时间Tue Mar 6 10:48:09 2012
Objective-C的说明文件
说如果传入物件的Method 没有相关定义
也只是回传nil物件 不会当掉
但我实际测试的结果刚好相反
我传入"有定义"的Method
他反而出现红色惊叹号 说找不到
当然不是单纯的函式呼叫 出现这种问题
那一定是我眼花 有Bug没找出来
会出现这种问题 是在我使用动态系结的时候
譬如两个Class Foo 与 Bar
其中Bar 继承 Foo
我宣告 Foo *obj = [[Bar alloc]init];
则我执行 [obj bar /*Bar里定义的Method*/];
就会出现红色惊叹号 说Class Foo里找不到这个Method
为避免中文表达不清楚 我使用一简单程式例子说明
我使用的IDE是XCode4.3
// Foo.h
@interface Foo : NSObject
@end
//Foo.m
#import "Foo.h"
@implementation Foo
@end
// Bar.h
#import "Foo.h"
@interface Bar : Foo
- (void)barRun;
@end
// Bar.m
#import "Bar.h"
@implementation Bar
- (void)barRun{
// NOP
}
@end
好了 然後我执行以下程式码
Foo *obj = [[Bar alloc]init];
[obj barRun];
出现红色惊叹号
IDE直接档掉 说Foo Class里面找不到barRun这个Method
他那麽鸡婆干嘛 教学文件不是说 找不到Method就回传nil吗
------------------------------------------------------
不要吹毛求疵 鸡蛋里挑骨头找程式码有问题了
这只是随手打打一个简单的例子
况且我使用以下方法重新执行barRun 如下
[obj performSelector:@selector(barRun)]
没有问题 obj在执行时期 真的可以动态系结到 Bar这个Class
请问 说明文件讲的 没有定义相关Method就回传nil
这个强大的功能怎麽不见了
请问这是XCode4.3的新功能
避免初心的使用者呼叫未定义的Method吗
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 60.250.139.230
1F:推 popcorny:应该只是因为你没有include .h档吧 03/06 10:57
咦?等一下 我Foo.h 跟Bar.h都加进来了 一样是这个问题
况且没加进来的话 早在Foo *obj = [[Bar alloc]init];
这一行就出错了
请问是哪个.h档也要加进来呢
※ 编辑: wemee 来自: 60.250.139.230 (03/06 11:05)
2F:推 yllan:因为你用了 ARC 吧。如果是ARC状态下,compiler 要知道回传 03/06 11:39
3F:→ yllan:什麽,才知道要怎麽管记忆体啊~ 03/06 11:41
4F:→ yllan:如果你其实是回传id,但compiler当nil,不处理就会leak 03/06 11:42
5F:→ yllan:但如果不是id又去处理,就会crash。compiler没办法用猜的 03/06 11:43
谢谢 原来是ARC的关系
我在该档案的compiler flag加上-fno-objc-arc
就可以了 变成只有警告而已
只是物件的生命要自己控制好
※ 编辑: wemee 来自: 60.250.139.230 (03/06 11:58)