Objective c Apple CameraUI代码内存泄漏

Objective c Apple CameraUI代码内存泄漏,objective-c,ios,memory-management,memory-leaks,camera,Objective C,Ios,Memory Management,Memory Leaks,Camera,我使用了苹果“iOS摄像头编程主题”指南中的一些代码,如下所示: UIImagePickerController *cameraUI = [[UIImagePickerController alloc] init]; cameraUI.sourceType = UIImagePickerControllerSourceTypeCamera; // Displays a control that allows the user to only take picture: cameraUI.med

我使用了苹果“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];
除了上面显示的命令外,我没有其他的
释放
命令。考虑到所讨论的数组是cameraUI(已发布)的一个属性,我不确定我应该做什么(如果有的话)


有什么想法吗?

除非
cameraUI.mediaTypes
属性是用
assign
定义的,否则这里确实存在漏洞。这可能有助于将行分解为多个步骤,仅用于指导

NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
cameraUI.mediaTypes = [[[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil] autorelease];
如果
cameraUI
负责自己的内存,那么分配什么或何时分配都不重要。但是,在第一行中,您正在构造一个变量,但从未释放它。那么,你如何解决这个问题?修复它的标准方法是在施工期间自动释放

NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
cameraUI.mediaTypes = [[[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil] autorelease];
如果您正在处理必须尽快释放的非常大的对象,则需要在将其传递给
cameraUI
后手动释放:

NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
[mediaTypes release];

只有在需要时才使用第二个表单-它更容易出错。

除非
cameraUI.mediaTypes
属性是用
assign
定义的,否则这里确实存在漏洞。这可能有助于将行分解为多个步骤,仅用于指导

NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
cameraUI.mediaTypes = [[[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil] autorelease];
如果
cameraUI
负责自己的内存,那么分配什么或何时分配都不重要。但是,在第一行中,您正在构造一个变量,但从未释放它。那么,你如何解决这个问题?修复它的标准方法是在施工期间自动释放

NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
cameraUI.mediaTypes = [[[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil] autorelease];
如果您正在处理必须尽快释放的非常大的对象,则需要在将其传递给
cameraUI
后手动释放:

NSArray* mediaTypes = [[NSArray alloc] initWithObjects: (NSString *) kUTTypeImage, nil];
cameraUI.mediaTypes = mediaTypes;
[mediaTypes release];

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

Ahh明白。是的,成功了。快速提问…为什么第二个表单更容易出错(我在整个应用程序中都有类似的编码)。第二个表单在编写时工作正常,但随着程序的增长,很容易在分配和发布之间放置代码行。然后在某个时刻,您意外地删除了该版本,或者将其移动到if语句中。第一个版本更难被意外破坏。另一方面,将所有内容都放在自动释放池中可能意味着在池耗尽之前内存就用完了…啊,是的-现在一切都有意义了。所以它很容易受到人为错误的影响!!Thanksah明白了。是的,成功了。快速提问…为什么第二个表单更容易出错(我在整个应用程序中都有类似的编码)。第二个表单在编写时工作正常,但随着程序的增长,很容易在分配和发布之间放置代码行。然后在某个时刻,您意外地删除了该版本,或者将其移动到if语句中。第一个版本更难被意外破坏。另一方面,将所有内容都放在自动释放池中可能意味着在池耗尽之前内存就用完了…啊,是的-现在一切都有意义了。所以它很容易受到人为错误的影响!!谢谢