我使用了Apple“ iOS相机编程主题”指南中的一些代码,如下所示:
UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init];
cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera;
// Displays a control that allows the user to only take picture:
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
// Hides the controls for moving & scaling pictures, or for trimming movies. To instead show the controls, use YES.
cameraUI.allowsEditing = NO;
cameraUI.delegate = delegate;
[controller presentModalViewController: cameraUI animated: YES];
[cameraUI release];
但是,当我“分析”我的代码时,Xcode表示我可能从以下行泄漏:
cameraUI.mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
除了上面显示的命令外,我没有其他
release
命令。鉴于所讨论的数组是cameraUI(已发布)的属性,我不确定该怎么做(如果有的话)。有什么想法吗?
最佳答案
除非使用cameraUI.mediaTypes
定义assign
属性,否则此处确实存在泄漏。仅出于指导目的,将线路分成多个步骤可能会有所帮助。
NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
如果
cameraUI
照顾自己的内存,则分配的内容或时间无关紧要。但是,在第一行中,您正在构造一个变量,但从不释放它。那么,您如何解决呢?修复它的标准方法是在施工过程中自动释放。cameraUI.mediaTypes = [[[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil] autorelease];
如果您正在处理必须尽快释放的非常大的对象,则在将其传递给
cameraUI
后,需要手动释放它:NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
[mediaTypes release];
仅在需要时才使用第二种形式-容易出错。