Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 参考计数的减量不正确&;内存泄漏_Objective C_Release_Avfoundation_Memory Leaks_Avaudiorecorder - Fatal编程技术网

Objective c 参考计数的减量不正确&;内存泄漏

Objective c 参考计数的减量不正确&;内存泄漏,objective-c,release,avfoundation,memory-leaks,avaudiorecorder,Objective C,Release,Avfoundation,Memory Leaks,Avaudiorecorder,通过“分析”,在dealloc中我得到: 调用方此时不拥有的对象的引用计数的减少量不正确 #导入 @接口XYZViewController:UIViewController @财产(保留)AVAudioRecorder*记录器; @结束 @XYZViewController的实现 @综合记录器; -(无效)解除锁定 { [自记释放]; [super dealoc]; } -(无效)viewDidLoad { NSURL*url=[NSURL fileURLWithPath:@“/dev/null

通过“分析”,在dealloc中我得到: 调用方此时不拥有的对象的引用计数的减少量不正确

#导入
@接口XYZViewController:UIViewController
@财产(保留)AVAudioRecorder*记录器;
@结束
@XYZViewController的实现
@综合记录器;
-(无效)解除锁定
{
[自记释放];
[super dealoc];
}
-(无效)viewDidLoad
{
NSURL*url=[NSURL fileURLWithPath:@“/dev/null”];
NSDictionary*设置=[NSDictionary Dictionary WithObjectsAndKeys:
[NSNumber numberWithFloat:44100.0],AVSampleRateKey,
[NSNumber Number Withint:kAudioFormatAppleLossless],AVFormatIDKey,
[NSNumber numberWithInt:1],AVNumberOfChannelsKey,
[NSNumber Number Withint:AVAudioQualityMax],AVEncoderAudioQualityKey,
零];
n错误*错误;
self.recorder=[[AVAudioRecorder alloc]initWithURL:url设置:设置错误:&错误]自动删除];
}
@结束
这是否意味着我不应该释放它?
此外,我试图“分析”代码,但我从
[[[AVAudioRecorder alloc]initWithURL:url设置:设置错误:&error]自动释放]
中得到内存泄漏,无论发生什么情况。

您应该直接释放ivar,而不是通过访问器:

- (void)dealloc
{
    [recorder release];
    [super dealloc];
}

您不拥有访问器返回的对象,因此不应该释放它。

您应该直接释放ivar,而不是通过访问器:

- (void)dealloc
{
    [recorder release];
    [super dealloc];
}

您不拥有访问器返回的对象,因此不应释放它。

与其向属性访问器方法返回的对象发送
-release
,不如将属性本身设置为
nil

- (void)dealloc {
    self.recorder = nil;
    [super dealloc];
}
编译器将知道如何做正确的事情,因为您已经在属性声明中指定了存储语义。合成使用
retain
语义声明的属性实际上相当于编写以下访问器方法:

- (AVAudioRecorder *)recorder {
    return recorder;
}

- (void)setRecorder:(AVAudioRecorder *)newRecorder {
    [newRecorder retain];
    [recorder release];
    recorder = newRecorder;
}
编写
self.recorder=nil
时,编译器将其转换为
[self-setRecorder:nil]
。因此,以这种方式将属性设置为
nil
,可以避免内存泄漏和悬空指针,减少您的样板文件,并更清楚地表达代码的意图


最后,重读不会有什么坏处,它有一个关于声明属性的部分;并且,它详细介绍了所有不同的内存管理方法。

不要将
-release
发送到属性访问器方法返回的对象,而是将属性本身设置为
nil

- (void)dealloc {
    self.recorder = nil;
    [super dealloc];
}
编译器将知道如何做正确的事情,因为您已经在属性声明中指定了存储语义。合成使用
retain
语义声明的属性实际上相当于编写以下访问器方法:

- (AVAudioRecorder *)recorder {
    return recorder;
}

- (void)setRecorder:(AVAudioRecorder *)newRecorder {
    [newRecorder retain];
    [recorder release];
    recorder = newRecorder;
}
编写
self.recorder=nil
时,编译器将其转换为
[self-setRecorder:nil]
。因此,以这种方式将属性设置为
nil
,可以避免内存泄漏和悬空指针,减少您的样板文件,并更清楚地表达代码的意图


最后,重读不会有什么坏处,它有一个关于声明属性的部分;而且,它详细介绍了所有不同的内存管理方法。

谢谢,但在本例中并不能解决内存泄漏问题。在
viewDidUnload
中,在
[foo release]
之后,我应该使用
self.foo=nil
foo=nil
?对于内存泄漏,显然不是我的错:谢谢,但在目前的情况下并不能解决内存泄漏问题。在
viewDidUnload
中,在
[foo release]
之后,我应该使用
self.foo=nil
foo=nil
?对于内存泄漏,显然不是我的错:因此
self.foo=nil
优于
[foo release];foo=零。我将在dealloc和viewDidUnload中使用它。非常感谢。使用
self.foo=nil时唯一要注意的事情-dealloc
中的code>(或者在
-init
中的
self.foo=bar;
就是说,如果您编写了一个有副作用的
-setFoo:
的自定义实现,您可能会遇到一个奇怪的bug。在
-init
-dealloc
的上下文中,您的对象被视为处于无效或未初始化状态,因此在向
self
发送任何消息时必须小心。但是,在设置或清除简单属性的常见情况下,我使用点表示法。内存管理bug比副作用bug更常见
优于
[foo release];foo=零。我将在dealloc和viewDidUnload中使用它。非常感谢。使用
self.foo=nil时唯一要注意的事情-dealloc
中的code>(或者在
-init
中的
self.foo=bar;
就是说,如果您编写了一个有副作用的
-setFoo:
的自定义实现,您可能会遇到一个奇怪的bug。在
-init
-dealloc
的上下文中,您的对象被视为处于无效或未初始化状态,因此在向
self
发送任何消息时必须小心。但是,在设置或清除简单属性的常见情况下,我使用点表示法。内存管理bug比副作用bug更常见。