2010-11-11 34 views
0

我使用的是WordNik samples-sdk的示例,我杀死了大多数内存泄漏,但有一个警告,我无法理解它是什么以及如何修复它!如何从iPhone的wordnik示例中删除此警告?

我已经向他们的Google小组询问过帮助,但他们几乎回答了我问的每个问题,但他们一直忽略这一问题,我希望stackoverflow的集体大脑解决问题。

此文件生成有关的iPad/iPhone警告 - 在产生警告file

Wordnik/WordService.m: In function '-[WordService fetchDefinitions:useCanonical:]': 
Wordnik/WordService.m:52: warning: incompatible Objective-C types initializing 'struct Word *', expected 'struct Definition *' 

整个sdk样本是here

+0

如果可以,请使用clang编译并查看它是否生成警告。它会告诉你什么警告标志产生警告。但通常这样的警告意味着编译器不知道如何转换类型。 – 2010-11-11 20:35:23

+0

我可以给它一个 - 代码工作它不会崩溃或任何东西,但。 – amok 2010-11-11 20:51:28

回答

2

我想你的意思是链接到this file。在52行,我们发现这样的:

Definition * def = [[Definition alloc]init:dict]; 

编译器不能工作了init:方法是否指(Word *)init:从定义类Word类或(Definition *)init:。它错误地猜测它是来自Word类的方法,因此给你一个警告,说明你正在用Word *对象初始化一个Definition *变量。

这是可以解决的,象这样一投:

Definition * def = [((Definition *)[Definition alloc]) init:dict]; 

甚至:

Definition * def = (Definition *) [[Definition alloc]init:dict]; 

没有,编译器是不够明智地意识到[Definition alloc]可能返回一个定义对象。 (我不禁要提到,写这个示例代码的人对于释放/自动释放对象有非常随意的态度,并且对内存泄露表现出了热爱,在这个文件中word从未被释放过,没有存储任何值在def曾经发布,也不是definitions

+0

如果在这个答案中有一种方法可以打3但不是一个复选标记,那么我会提出一个请求,将其加倍。你回答了我的问题,并且你用非常简单的话来说明了“样本”的核心问题...... – amok 2010-11-11 23:06:08

+2

只是想出了为什么你必须这样做。通常这在ObjC代码中不是问题,这是因为-init方法被声明为返回一个id。在示例代码中,Word和Definition都具有-init方法,这些方法被声明为返回其特定类型的对象引用。正如grahmparks所说,这会导致编译器对被调用的哪个-init方法感到困惑,并且会给出警告。通常,-init会返回一个id,它可以分配给任何对象指针变量。这里真正的解决方法是将这些-init方法更改为返回id。 – Ryan 2010-11-11 23:13:59

0

的示例代码就是这样,示例代码,不适合实际使用。但Wordnik(为此我工作)正在开发一个官方的Objective-C SDK。它完全支持Wordnik API,并具有一些很好的功能,如请求批处理。如果你有兴趣在早期使用,有一个在此线程信息:

http://groups.google.com/group/wordnik-api/browse_thread/thread/13bcfb6b53c7eaee

+0

我没有质疑样品质量或目的,我要求帮助,使他们的固定样本,因为你的公司拒绝做:-) – amok 2010-11-11 21:59:01

0

只是一种预感,但尝试添加以下语句附近WordService.m其他的#import声明:

#import "Definition.h" 
+0

的共享相同的预感 - 我试过了,它不修复问题。 :-) – amok 2010-11-11 22:28:21