近来几个使用web services的项目都是利用SudzC来生成Obj-C的处理代码,一直都用得很好,也很方便。
之前的项目都是非ARC的,新近建立了一个ARC的项目,而SudzC也有相应的生成ARC版本的代码,于是像以往以往加入使用。
今天在调试这个项目的时候,发现web services返回的结果都是nil的,而请求返回的结果却不为空。(通过log打印可知)
设置断点调试,发现是以下代码执行后返回空值。
CXMLNode* element = [[Soap getNode: [doc rootElement] withName: @"Body"] childAtIndex:0];
继续跟进调试,xml的节点返回的是:(CXMLNode* child的打印结果)
<CXMLElement 0x7591210 [0x7588bb0] soap:Body <soap:Body><DoLoginResponse xmlns="http://tempuri.org/"><DoLoginResult>{...}</DoLoginResult></DoLoginResponse></soap:Body>>
回看之前做的几个web services项目,打印的结果是类似这样的:
<CXMLElement 0x7594050 [0x81b95a0] Body <Body><ValidateUserLoginResponse><ValidateUserLoginResult>{"Email":"sing@163.com","ErrMsg":"","MobilePhone":"13725373425","UserName":"sing"}</ValidateUserLoginResult></ValidateUserLoginResponse></Body>>
问题就出在两次获取的节点的key不同,一个是soap:Body,一个是Body,但以下代码两个项目中都是一样的:
CXMLNode* element = [[Soap getNode: [doc rootElement] withName: @"Body"] childAtIndex:0];
故此会出现最新的web services项目获取到的element为空值的情况了。
将获取节点的代码改成如下就解决了返回空值的问题了。
CXMLNode* element = [[Soap getNode: [doc rootElement] withName: @"soap:Body"] childAtIndex:0];
问题是解决了,但奇怪的是不使用ARC版本处理就完全没问题,使用了ARC版本却要修改代码才能获取到正确的结果,尝试进一步调试查找最终原因,但终究因为代码量较大,也没有太多时间深入了解,所以只能作罢。google了一把,发现也有人出现这样的问题,也是只能自己手动改代码而找不出原因。看来这个问题还是要留给作者自己去处理了,我是心有余而力不足啊。这篇文章也算是标记一下出现的问题,等以后该问题解决了看看出问题的根源是在哪里。
btw,今天想利用SudzC重新生成一次代码,结果却出现无法生成代码,php执行出错的问题。希望作者能尽早发现,尽快修正。