Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 启用ARC的AF2后异步内存泄漏_Ios_Objective C_Memory Leaks_Automatic Ref Counting_Afnetworking 2 - Fatal编程技术网

Ios 启用ARC的AF2后异步内存泄漏

Ios 启用ARC的AF2后异步内存泄漏,ios,objective-c,memory-leaks,automatic-ref-counting,afnetworking-2,Ios,Objective C,Memory Leaks,Automatic Ref Counting,Afnetworking 2,我对iOS编码相当陌生。我从以前的程序员那里继承了一段代码,他有一个好主意,就是把代码分成几段。我希望我能让大家理解这一点 邮政服务的一部分 @property(nonatomic)SEL ReturnAction; @property(nonatomic)id ReturnDelegate; 在postservice.m中调用的方法 -(void)Send:(NSString *)Pmethod Mparams:(NSDictionary *)Mparams Mdelegate:(id)

我对iOS编码相当陌生。我从以前的程序员那里继承了一段代码,他有一个好主意,就是把代码分成几段。我希望我能让大家理解这一点

邮政服务的一部分

@property(nonatomic)SEL ReturnAction;
@property(nonatomic)id  ReturnDelegate;
在postservice.m中调用的方法

-(void)Send:(NSString *)Pmethod  Mparams:(NSDictionary *)Mparams Mdelegate:(id)Mdelegate IsSycn:(BOOL)IsSycn ExternalUrl:(BOOL)ExternalUrl{
Murl=[Murl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:Murl]];
    manager.responseSerializer = [AFHTTPResponseSerializer serializer];
    manager.requestSerializer = [AFHTTPRequestSerializer serializer];
    [manager POST:Murl parameters:Mparams success:^(AFHTTPRequestOperation *operation, id responseObject) { 
        NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
        //NSLog(@"success %@", string);
            if ([ReturnDelegate respondsToSelector:ReturnAction]) {
                ((void (*)(id, SEL, id))[ReturnDelegate methodForSelector:ReturnAction])(ReturnDelegate, ReturnAction, string);
        }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            //NSLog(@"error %@", error);
            if ([ReturnDelegate respondsToSelector:ReturnAction]) {
                ((void (*)(id, SEL, id))[ReturnDelegate methodForSelector:ReturnAction])(ReturnDelegate, ReturnAction, error);
            }
          }];
}
然后从另一个中级类方法调用

SEU中期邮政服务的一部分

@property(nonatomic)SEL FetchCompleted;
@property(nonatomic)SEL FetchFailed;
@property(nonatomic)id  ReturnDelegate;//unsafe_unretained
@property(nonatomic, retain)PostService * service;
SE_MidPostService.m的示例部分

  -(void)GetDeviceStatus:(NSString *)DeviceID RestID:(NSNumber *)ReID
{
    NSLog(@"GetDeviceStatus");
    NSDictionary * Parameters=[[NSDictionary alloc] initWithObjects:[NSArray arrayWithObjects:DeviceID,ReID, @"GetStat", nil]
                                                             forKeys:[NSArray arrayWithObjects:@"DeviceUniqueId",@"ReID", @"OP",nil]];
    [service setReturnAction:@selector(GetDeviceStatusCallBack:)];
    [service setReturnDelegate:self];
    [service Send:@"GetStat" Mparams:Parameters Mdelegate:nil IsSycn:NO ExternalUrl:NO];

}
-(void)GetDeviceStatusCallBack:(id)value{
    NSLog(@"GetDeviceStatusCallBack");
    if([value isKindOfClass:[NSError class]]) {
        if ([ReturnDelegate respondsToSelector:FetchCompleted]) {
           ((void (*)(id, SEL, id, id))[ReturnDelegate methodForSelector:FetchCompleted])(ReturnDelegate, FetchCompleted, nil, value);
        }
        return;
    }
    if ([ReturnDelegate respondsToSelector:FetchCompleted]) {
        ((void (*)(id, SEL, id, id))[ReturnDelegate methodForSelector:FetchCompleted])(ReturnDelegate, FetchCompleted, value, nil);
    }
}
这些被代码的不同部分调用,简化了代码

    SE_MidPostService * service=[[SE_MidPostService alloc] init];
    [service setReturnDelegate:self];
    [service setFetchCompleted:@selector(DeviceStatusCheck:err:)];
    [service GetDeviceStatus:uuid RestID:id;
}

-(void)DeviceStatusCheck:(NSNumber *)Result err:(NSError *)err{
    if (err!=nil) {...}
//does what ever is needed
}
工具主要强调返回发生的代码

((void (*)(id, SEL, id, id))[ReturnDelegate methodForSelector:FetchCompleted])(ReturnDelegate, FetchCompleted, value, nil);
我以为ARC会处理这件事,但事实并非如此。 我确实读过一些关于autoreleasepool的书。我是否需要将此添加到成功编码中

@autoreleasepool {
    // Code that creates autoreleased objects.
}

我希望这里有足够的信息。抱歉,在iOS中是新手,这没有帮助。

当您以这种方式调用方法时:

 ((void (*)(id, SEL, id, id))[ReturnDelegate methodForSelector:FetchCompleted])(ReturnDelegate, FetchCompleted, nil, value);
ARC没有任何合理插入保留和释放的方法,因此这会导致泄漏或崩溃是可以理解的

我在其他地方读到过这方面的文章,除了切换到块而不是委托,似乎没有一个好的解决方案,这通常更干净、更灵活


只需在一个块中执行您的委托传递,而不是使用选择器

如果其他人想要我解决这个问题的方法,我确实把所有的子类都去掉了

这确实增加了编码方面的额外工作,但不会有任何泄漏

这是我使用的代码。我还观看了wwdc 2013内存管理课程。帮助很大

NSString * Murl;
        Murl = [NSString stringWithFormat:@"http://%@/service.aspx",[[GlobalData sharedGlobalData].settings ServerIP]];
        Murl=[Murl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];

        AFHTTPRequestOperationManager *manager = [[AFHTTPRequestOperationManager alloc] initWithBaseURL:[NSURL URLWithString:Murl]];
        __weak typeof(self) weakmyself = self;
        manager.responseSerializer = [AFHTTPResponseSerializer serializer];
        manager.requestSerializer = [AFHTTPRequestSerializer serializer];
        [manager POST:Murl parameters:Parameters success:^(AFHTTPRequestOperation *operation, id responseObject) {
            NSString *string = [[NSString alloc] initWithData:responseObject encoding:NSUTF8StringEncoding];
            NSNumber *num = [NSNumber numberWithInteger: [string integerValue]];
            @autoreleasepool{
                //NSLog(@"success %@", string);
                [weakmyself Callbackfunction:num err:nil];
            }
        } failure:^(AFHTTPRequestOperation *operation, NSError *error) {
            //NSLog(@"error %@", error);
            NSError * err = error;
            @autoreleasepool{
                [weakmyself Callbackfunction:nil err:err];

            }
        }];

你能给我一个传递块的示例代码吗?你启动[manager POST:Murl parameters:Mparams success:…的代码将一个块传递给一个方法。我想我应该补充一点,有没有更好的方法可以做到这一点。我是否应该将所有代码移到主代码,并停止使用子类中间类的东西。