【发布时间】:2013-10-24 12:20:57
【问题描述】:
我有一个名为ServiceBrowser 的类。在这个类中,我有一个基于块的方法来搜索 NSNetServices。
我这样称呼方法:
[_serviceBrowser discoverServicesOfType:@"_theService._tcp."
inDomain:@"local."
didDiscoverServices:^(NSArray *services) {
NSLog(@"Services discovered %@", services);
[UIView fadeView:_button toAlpha:1.0 duration:0.5 completion:nil];
} didRemoveServices:^(NSArray *services) {
NSLog(@"Services removed %@", services);
} failure:^(NSString *message) {
NSLog(@"Failure %@", message);
}];
如果我删除对fadeView:toAlpha:duration:completion: 的调用,它会找到服务并将它们注销。仅当我在此块中使用 self 时,Xcode 才会崩溃,而控制台没有记录任何错误。
fadeView:toAlpha:duration:completion: 是 UIView 上的一个类别方法,它接受一个视图并将其淡入或淡出,这作为一个独立的方法工作得很好。问题是当我在块内使用_button 时它会崩溃。
我对此进行了调查,我认为这归结为保留周期。通过查看其他问题和博客文章,我应该在块内使用弱自我。
我尝试过使用__block id weakSelf = self; 和typeof(self) __weak w_self = self;,但都不起作用。
【问题讨论】:
-
你确定你的对象在调用块时仍然存在吗?
-
你的块是否在主线程上执行?
-
我已经检查过了,它在主线程上。
-
“我已经对此进行了调查,我认为它归结为保留周期。”保持循环不会导致崩溃。它们与崩溃相反。当你过度释放时通常会发生崩溃,即没有足够的保留。
标签: ios objective-c objective-c-blocks