누설 : 호출자가이 시점에서 소유 아닌 오브젝트의 참조 카운트 잘못된 감소량잘못된 감소는 할당 해제에서 I는 얻을에 '분석'으로
#import <AVFoundation/AVFoundation.h>
@interface XYZViewController : UIViewController
@property (retain) AVAudioRecorder *recorder;
@end
@implementation XYZViewController
@synthesize recorder;
- (void) dealloc
{
[self.recorder release];
[super dealloc];
}
- (void) viewDidLoad
{
NSURL *url = [NSURL fileURLWithPath:@"/dev/null"];
NSDictionary *settings = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithFloat: 44100.0], AVSampleRateKey,
[NSNumber numberWithInt: kAudioFormatAppleLossless], AVFormatIDKey,
[NSNumber numberWithInt: 1], AVNumberOfChannelsKey,
[NSNumber numberWithInt: AVAudioQualityMax], AVEncoderAudioQualityKey,
nil];
NSError *error;
self.recorder = [[[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error] autorelease];
}
@end
내가 출시하지 말아야한다는 의미입니까? 또한, 나는 'Profile'코드를 시도했는데 아무리 상관없이 [[[AVAudioRecorder alloc] initWithURL:url settings:settings error:&error] autorelease]
에서 메모리 누수가 발생합니다.
그래서'self.foo = nil;'은 [foo release]보다 낫다; foo = nil;'. 나는 그것을 dealloc과 viewDidUnload 둘 다에서 사용할 것이다. 고맙습니다! –
'-dealloc' (또는'-init'의'self.foo = bar;')에서'self.foo = nil;'을 사용하는 것을주의해야 할 유일한 것은 여러분이 부작용이있는'-setFoo :'의 커스텀 구현으로 인해 이상한 버그가 생길 수 있습니다. '-init' 또는'-dealloc' 문맥 안에서는 객체가 유효하지 않거나 초기화되지 않은 상태로 간주되므로'self'에 메시지를 보낼 때 조심해야합니다. 그러나 간단한 속성을 설정하거나 지우는 일반적인 경우에는 점 표기법을 사용합니다. 메모리 관리 버그는 부작용 버그보다 훨씬 일반적입니다. –