将NSDictionary的本地声明传递给performSelector

时间:2013-02-21 10:15:18

标签: cocoa nsdictionary selector

如何这样做,我不需要在选择器调用方法中正确放置数据对象?

带警告的代码(本地数据声明):

NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:@"SiluetaImage", @"ACTION", silueta_id, @"siluetaid", siluetaTyp_id, @"siluetatypid", nil];
[self performSelector:@selector(downloadBinDataForTyp:data:) 
           withObject:@"SiluetaImage" 
           withObject:data];

代码没有警告:

[self performSelector:@selector(downloadBinDataForTyp:data:) 
           withObject:@"SiluetaImage" 
           withObject:[NSDictionary dictionaryWithObjectsAndKeys:@"SiluetaImage", @"ACTION", silueta_id, @"siluetaid", siluetaTyp_id, @"siluetatypid", nil]];

选择器:

- (void)downloadBinDataForTyp:(NSString *)typ data:(NSDictionary*)data
{
    ASINetworkQueue *q = [self queue];
    NSString *sUrl = @"url_web_service";

    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:[NSURL URLWithString:sUrl]];
    NSString *msgLength = [NSString stringWithFormat:@"%d", [[self getMsg] length]];

    [request setTimeOutSeconds:60];
    [request addRequestHeader: @"Content-Type" value:@"text/xml; charset=utf-8"];
    [request addRequestHeader: @"SOAPAction" value:_action];
    [request addRequestHeader: @"Content-Length" value:msgLength];
    [request setRequestMethod: @"POST"];
    request.userInfo = data;

    [request appendPostData:[self getMsg]];
    [request setDelegate:self];

    [q addOperation:request];
    [q go];

}

1 个答案:

答案 0 :(得分:1)

NSDictionary *data = [NSDictionary dictionaryWithObjectsAndKeys:@"SiluetaImage", @"ACTION", silueta_id, @"siluetaid", siluetaTyp_id, @"siluetatypid", nil];
[self performSelector:@selector(downloadBinDataForTyp:data:) 
           withObject:@"SiluetaImage" 
           withObject:data];

在这里你传递data,其范围只是方法。在方法之外,它无法访问,因为它正在获取release d。