2011-11-14 3 views
1

나는 노래를 재생하는 간단한 프로그램이 있습니다. 상속받은 awakeFromNib 메소드에 있습니다. 그래서 ..NSSound는 작동하지만 초기화 또는 할당되지 않았습니다.

-(void)awakeFromNib { 
NSSound *song = [NSSound soundNamed:@"MyTune.mp3"]; 
[song play]; 
} 

제 질문은 왜 작동합니까? 어떻게이를 NSTextView 변수가 설정 한 ... 나는 또한 너무 문자열을 작동하는 것 같다이

NSSound *song = [[NSSound alloc]init]; 
song = [NSSound soundNamed:@"MyTune.mp3"]; 
[song play]; 
} 

할 필요가 없습니다 와서 나는 다음을 수행 할 수 있습니다

-(void)awakeFromNib { 
NSString *str = [NSString stringWithFormat:@"Hello there!"]; 
[myTextVariable insertText:str]; 
} 

왜 didn를 ' t 객체를 할당하고 초기화해야합니다. 나는 너무 잃었습니다. 도와주세요.

+0

누구? 나는 이것을 이해하는 데 어려움을 겪고있다. – Heartbound07

답변

1

많은 Apple 클래스에는 도우미 함수가 있으며, 이는 도우미 함수 내에서 alloc 및 init을 수행하는 클래스 수준에서 선언됩니다. 그들은 사용할 준비가 된 객체를 반환합니다. yu가 메서드에 대한 문서를 볼 수 있고 "주어진 이름과 관련된 NSSound 인스턴스를 반환합니다"와 같은 메시지가 있는지 확인할 수 있습니다. 당신 ALLOC 다음은 [NSSound soundNamed:@"MyTune.mp3"]에 의해 반환 된 새로운 객체와 포인터를 덮어 쓰기 때문에

-(void)awakeFromNib { 
NSSound *song = [NSSound soundNamed:@"MyTune.mp3"]; 
[song play]; 
} 

두 번째 예는 메모리 누수 :

첫 번째 예는 그러므로 좋은 코드입니다 the documentation에서

-(void)awakeFromNib { 

    // Create an NSSound object in memory and store the address in song. 
    NSSound *song = [[NSSound alloc]init]; 

    // If you don't want a memory leak this is your last chance to [song release] 

    // Create a NSSound object using a helper function and place its address 
    // in song, over writing the previous address. 
    song = [NSSound soundNamed:@"MyTune.mp3"]; 

    // We now lost track of the first NSSound object and can't release it because 
    // we overwrote the address. 

    [song play]; 
    } 

당신 이 메소드가 내부에 allocinit을 수행하고 인스턴스를 반환 함을 알 수 있습니다.

soundNamed :

주어진 이름과 관련된 NSSound 인스턴스를 반환합니다. (*는 NSString)

파라미터 사운드 데이터를 식별

soundName 이름 soundName :

+ (Id)를 soundNamed. soundName에 의해 식별 된 사운드 데이터로 초기화

반환 값

NSSound 인스턴스입니다.

+0

좋아, 내 두 번째 예를 들어 말씀 드리겠습니다. [노래 해방]; 같은 것이겠습니까? – Heartbound07

+0

할당하지 않았으므로 해제하지 않습니다. 도우미 함수를 사용하면 Apple의 코드가 릴리스를 제어합니다. 그것은 그것 * 할당했기 때문에 이것을한다. –

+0

나는 너의 의미를 모르겠다 고 생각한다. 두 번째 예에서 2 행과 3 행 사이에 릴리스를 삽입하는 방법에 대해 묻는 경우 예입니다. 기능적으로 첫 번째 예제와 같지만 CPU 사이클과 코딩이 낭비됩니다. –

관련 문제