3번째 실습 진행중 오류

해결됨
정상원 프로필

동일하게 진행 하였습니다만

소리가 나지를 않습니다..

프로젝트 네비게이터에는 4개(3개의 소리, 1개의 스위프트파일)

을 넣어서 엑스코드에서는 소리가 들리는 것은 확인하였습니다.

실기기와 에뮬에서 실행하면 아무런 에러는 나오지 않습니다.

(디버깅 창에서)

이름을 변경하는 레이블은 잘 변경이 됩니다...

아래는 소스와 디버깅창입니다.. 따로 소리를 내기위해서는 설정해야 하는 부분이 있습니까?

정상원 프로필
정상원 8달 전

자문 자답입니다만..

교재로 쓰인 책에서는 소리변수는 따로 위로 빼서 작성하더라구요.

혹시나 해서 그대로 쳐보니 정상적으로 작동(소리남)하였습니다.

강의에서 작성하신 코드대로 하면 왜 안되는 것일까요?

let의 사용법에 관련된 것인가요...?

코더스하이 프로필
코더스하이 8달 전

안녕하세요, 정상원님. 

마지막까지 학습하시고 좋은 질문 주셔서 감사합니다.

덕분에 저의 실수를 보완할 수 있는 설명을 드리게 되어서 다행으로 생각합니다.

먼저, 제가 착각한 부분은 사운드의 특성과 변수의 Scope에 대한 것 입니다.

사운드 파일은 그 특성상 재생에 시간이 걸립니다.

하지만 함수 내에 선언한 변수의 경우, 그 함수의 실행이 끝나면 바로 메모리에서 릴리즈 되어 버립니다.

변수 내에서 사운드를 재생한 경우, 사운드 재생에 대한 명령을 실행하자 마자

사운드 파일이 메모리에서 사라져 버려서 더 이상 재생을 못하게 된 경우 입니다.

위 그림과 같이 사운드가 재생되는 시간동안 그 함수에 머무르게 하면 사운드가 끝까지 재생되는 것을 확인할 수 있습니다.

그래서 정상원님이 책의 코드와 동일하게 작성한 것 처럼, 

뷰 컨트롤러 레벨에서 사운드 변수를 선언하면, 함수에서는 빠져 나오더라도 사운드 파일은 존재하고 있으므로

사운드 재생을 마무리 할 수 있었던 거죠. 

보통 실제 앱 개발시 사운드 재생 관련한 기능을 구현할 때는 , 

SimpleSound.swift 내부에서처럼 AudioServicesPlaySystemSound() 함수를 바로 사용하는게 아니라AVAudioPlayer 등의 보다 하이레벨 API를 사용해 이러한 고려를 하지 않아도 되는 방식을 사용합니다.

이 부분은 책의 범위를 벗어나지만 AVFoundation을 참고하시기 바랍니다.

도움이 되셨길 바랍니다.

감사합니다.

지식공유자 되기
많은 사람들에게 배움의 기회를 주고,
경제적 보상을 받아보세요.
지식공유참여
기업 교육을 위한 인프런
“인프런 비즈니스” 를 통해 모든 팀원이 인프런의 강의들을
자유롭게 학습하는 환경을 제공하세요.
인프런 비즈니스