Apple CameraUI代码中的内存泄漏

时间:2012-04-15 13:38:21

标签: objective-c ios memory-management memory-leaks camera

我使用了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的属性(已发布),我不知道应该做什么(如果有的话)。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

除非使用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];

如果您需要,只使用第二种形式 - 它更容易出错。