块执行iOS和分配可变(block execution iOS and assigning vari

2019-10-31 00:10发布

我现在用的是Drupal的IOS-SDK(基于AFNetworking)和我的应用程序有一个标签栏控制器,故事板创建。 当装载视图控制器中的一个我建立在请求initWithCoder使用Drupal-IOS-SDK和分配在一个实例变量success block 。 后来在viewDidLoad我尝试打印这个变量,我感兴趣的是为什么我要保留成功的块中的实例变量,即使我定义具有自动释放变量。

这不是圆弧!

不使用在成功留住块

我VC.h

@interface AboutViewController : UIViewController {
    @private
    NSDictionary *response;
    NSString *aboutPageHTML;

}
@end

我VC.m

-(id) initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
    NSDictionary *viewData = [NSMutableDictionary new];

    [viewData setValue:@"aboutse" forKey:@"view_name"];

    aboutPageHTML = [[[NSString alloc]init] autorelease];

    void(^successBlock)(AFHTTPRequestOperation*, id) =
    ^(AFHTTPRequestOperation *operation, id responseObject) {
        response = [responseObject copy];
        aboutPageHTML = [response valueForKey:@"body"];
        NSLog(@"%s - %@", __PRETTY_FUNCTION__, aboutPageHTML);

        [aboutPageHTML retain]; // critical!

    };

    [DIOSView viewGet:viewData success:successBlock
              failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                  NSLog(@"%s, %@", __PRETTY_FUNCTION__, error);            
    }];

}
return self;
}

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view.

    NSLog(@"%s - %@", __PRETTY_FUNCTION__, aboutPageHTML);
    NSLog(@"%s - %f %f", __PRETTY_FUNCTION__, self.view.bounds.size.width, self.view.bounds.size.height);  
}

编辑:

声明与变量__block似乎不有所作为。 怎么会?

Answer 1:

有很多事情不对的代码。 aboutPageHTML是,你希望有一个强有力的参考实例变量(即应予以保留)。 在aboutPageHTML = [[[NSString alloc]init] autorelease]; 你是不是保持强大的参考吧。 这是不正确。

后来就在你的成功的块(这是不相干的,它是一个块;它只是将随后运行任何代码),你做aboutPageHTML = [response valueForKey:@"body"]; [aboutPageHTML retain]; aboutPageHTML = [response valueForKey:@"body"]; [aboutPageHTML retain]; 这确实能保留存储在实例变量的对象。 所以,你正在用在两个地方的内存管理相同的实例变量不一致。

此外,当您指定的另一个值的强引用的变量,你应该确保以释放先前的值,你是不是做。 这同样适用于这两种aboutPageHTMLresponse

最后,通过对象指向的viewData被泄露,因为你有很强的参考吧(你用new ),但不要将其释放。

此外,你应该使用setObject:forKey:objectForKey:对于词典。 而你需要声明一个可变的字典,当你想,你可以改变一个字典。 (这可能是为什么你(错误地)决定使用setValue:forKey:

所以在最后,这将是更喜欢它:

-(id) initWithCoder:(NSCoder *)aDecoder {
if ((self = [super initWithCoder:aDecoder])) {
    NSMutableDictionary *viewData = [NSMutableDictionary new];

    [viewData setObject:@"aboutse" forKey:@"view_name"];

    aboutPageHTML = [[NSString alloc] init];

    void(^successBlock)(AFHTTPRequestOperation*, id) =
    ^(AFHTTPRequestOperation *operation, id responseObject) {
        [response release];
        response = [responseObject copy];
        [aboutPageHTML release];
        aboutPageHTML = [[response objectForKey:@"body"] retain];
    };

    [DIOSView viewGet:viewData success:successBlock
              failure:^(AFHTTPRequestOperation *operation, NSError *error) {
                  NSLog(@"%s, %@", __PRETTY_FUNCTION__, error);            
    }];
    [viewData release];
}
return self;
}


文章来源: block execution iOS and assigning variable