我最近重构了我的应用以实现命令模式。为此,我试图将所有功能都插入到适当的命令类中。我已成功实现了所有命令的模式,但有一个例外。我有一个名为HarvestPhotoCommand
的命令,它启动UIImagePickerController
,我想使用该命令类作为选择器的委托。看起来很简单,但由于某种原因,没有调用委托方法。
这是我的代码:
//Header file
@interface WSHarvestPhotoCommand : WSCommand
<
UINavigationControllerDelegate,
UIImagePickerControllerDelegate,
MWPhotoBrowserDelegate
>
@end
//From the super class header file:
@property (nonatomic, weak) WSMapViewEngine *mapViewEngine;
//Implementation file
-(void)execute
{
_imagePicker = [[UIImagePickerController alloc] init];
_imagePicker.sourceType = UIImagePickerControllerSourceTypeCamera;
_imagePicker.delegate = self;
_imagePicker.navigationBar.barStyle = [WSAppSettings sharedSettings].theme.barStyle;
[self.mapViewEngine.mapVC presentViewController:_imagePicker animated:YES completion:nil];
}
#pragma mark - UIImagePickerControllerDelegate
#pragma mark -
- (void)imagePickerController:(UIImagePickerController *)picker didFinishPickingMediaWithInfo:(NSDictionary *)info
{
NSLog(@"Please hit me!");
}
-(void)imagePickerControllerDidCancel:(UIImagePickerController *)picker
{
NSLog(@"Or me!");
}
WSCommand
是NSObject
,self.mapViewEngine
也是self.mapViewEngine.mapVC
。 UIViewController
是mapViewEngine
。
到目前为止,我尝试过两次实验。首先,我在mapVC
上设置委托协议,并将其作为委托;第二,我为UIImagePicker
做了同样的事情。这两个实验都有效,这意味着在每个类中都调用了委托方法。这证明我的mapViewEngine
实现是正确的。
那么为什么同样的命令类不起作用呢?它和mapViewEngine
都是NSObject,所以我知道这不是问题所在。我想我可以让mapVC
或_users
代表,但我这样做的全部原因是要解除我的课程。我整晚都试图解决这个问题,所以此时我会接受任何想法或建议。
答案 0 :(得分:2)
如果您使用ARC,则delegate
的{{1}}应为UIImagePickerController
。这意味着在weak
死亡UIImagePickerControllerDelegate
的对象后,delegate
的值自动变为UIImagePickerController
。
在nil
上进行任何点击之前,您的WSHarvestPhotoCommand
对象会在内存中消失。
答案 1 :(得分:1)
这(在我之前的评论中提出)是一个内存管理问题,委托回调被解雇但是已经被委托的对象已经被释放,因为它没有强指针支持。
由于DisableR指出委托连接没有影响对象保留计数(并且你没有像两年前那样得到一个例外,因为委托已经没有了......)