gpt4 book ai didi

iphone - iPhone 的 SudzC 似乎在每次 Web 服务调用时泄漏 1kB

转载 作者:行者123 更新时间:2023-11-29 13:38:54 25 4
gpt4 key购买 nike

Instruments 报告每次使用 SudzC 生成的代码调用 Soap Web 服务时都会泄漏 2 个对象。

我已经将它缩小到一个简单的案例,使用代码调用免费的公共(public)网络服务 (http://www.webservicex.net/geoipservice.asmx?WSDL) 并且没有身份验证。不幸的是,运行 SudzC 项目需要大量设置,但您可以通过将 WSDL URL 放入 http://www.sudzc.com/ 来查看生成的代码。并选择“来自 iOS 的 Objective-C”。

Leaked Object   #   Address Size    Responsible Library Responsible Frame
Malloc 1.00 KB, 0x5035400 1.00 KB Foundation-[NSCFString appendString:]
NSCFString, 0x4c3d390 32 Bytes Foundation -[NSPlaceholderMutableString init]

每个对象的调用栈是

3 Foundation -[NSCFString appendString:]
4 SoapDemo +[Soap createEnvelope:forNamespace:forParameters:withHeaders:] /Users/user1/Desktop/SRC/SoapDemo/SoapDemo/Soap/Soap.m:50
5 SoapDemo +[Soap createEnvelope:forNamespace:withParameters:withHeaders:] /Users/user1/Desktop/SRC/SoapDemo/SoapDemo/Soap/Soap.m:114
6 SoapDemo -[WSXGeoIPService GetGeoIP:action:IPAddress:] /Users/user1/Desktop/SRC/SoapDemo/SoapDemo/Generated/WSXGeoIPService.m:55
7 SoapDemo -[SoapDemoViewController callWebService] /Users/user1/Desktop/SRC/SoapDemo/SoapDemo/SoapDemoViewController.m:14
8 SoapDemo -[SoapDemoViewController press:] /Users/user1/Desktop/SRC/SoapDemo/SoapDemo/SoapDemoViewController.m:19

调用代码:

- (IBAction)press:(id)sender {
NSLog(@"pressed");
[self callWebService];
}

-(void)callWebService {
WSXGeoIPService* service = [WSXGeoIPService service];
[service GetGeoIP:self action:@selector(handleResponse:) IPAddress:@"209.85.147.103"];
}

-(void) handleResponse:(id)value{
NSLog(@"%@", value);
}

根据 [Soap createEnvelope] 中的工具,Soap.m 中的冒犯行看起来很无害(标有注释)。

+ (NSString*) createEnvelope: (NSString*) method forNamespace: (NSString*) ns forParameters: (NSString*) params withHeaders: (NSDictionary*) headers
{
NSMutableString* s = [NSMutableString string];
[s appendString: @"<?xml version=\"1.0\" encoding=\"utf-8\"?>"];
[s appendFormat: @"<soap:Envelope xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\" xmlns:xsd=\"http://www.w3.org/2001/XMLSchema\" xmlns:soap=\"http://schemas.xmlsoap.org/soap/envelope/\" xmlns=\"%@\">", ns];
if(headers != nil && headers.count > 0) {
[s appendString: @"<soap:Header>"];
for(id key in [headers allKeys]) {
if([[headers objectForKey: key] isMemberOfClass: [SoapNil class]]) {
[s appendFormat: @"<%@ xsi:nil=\"true\"/>", key];
} else {
[s appendString:[Soap serializeHeader:headers forKey:key]];
}
}
[s appendString: @"</soap:Header>"];
}
[s appendString: @"<soap:Body>"];
[s appendFormat: @"<%@>%@</%@>", method,[params stringByReplacingOccurrencesOfString:@"&" withString:@"&amp;"], method];
[s appendString: @"</soap:Body>"];
[s appendString: @"</soap:Envelope>"]; // *** this is reported as causing the leak ***
return s;
}

我已经尝试修改该方法(通过组合 appendString 调用、添加一些虚拟日志记录等),但泄漏总是发生在该方法中。

我能想到几种可能性:

  • Instruments 错误识别的代码其他地方存在泄漏。
  • appendString 使用不当。
  • Apple 的 NSMutableString appendString 方法中存在漏洞。
  • 没有实际泄漏。

任何人都可以推断出正在发生的事情(或如何找到它)吗?

我使用的是 iOS SDK 4.3。

B 计划是将项目转换为自动引用计数...

最佳答案

对于那些不喜欢的人,请按照我的更改来修复您的漏洞,因为它非常有效:

  1. 在 SoapRequest.h 中将变量声明 id postData 替换为 NSString* postData
  2. 在 SoapRequest.h 中将其属性声明替换为 @property (copy, nonatomic) NSString* postData(在这里,我另外将所有 NSString 属性声明更改为“copy”)
  3. 在 SoapRequest.m 中,方法 (SoapRequest*) 创建:(SoapHandler*) 处理程序操作:(SEL) 操作 urlString:(NSString*) urlString soapAction:(NSString*) soapAction postData:(NSString*) postData反序列化:(id)反序列化request.postData = [postData retain] 行更改为 request.postData = postData

这 3 个步骤将解决您的问题。希望它也能在SudzcC框架中实现。

关于iphone - iPhone 的 SudzC 似乎在每次 Web 服务调用时泄漏 1kB,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9740609/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com