Serviceを読んで理解し、同意したものとみなします。スタック・オーバーフローはプログラマーとプログラミングに熱心な人のためのQ&Aサイトです。10.0iosアプリで音を取得して解析することを繰り返すアプリを作成しようと思い、https://qiita.com/a_jike/items/68dd13879f9df5b2b7a2上記urlサイトを参考にさせていただきました。そこのサイトに著者のGitHub上のコードが公開されておりました。https://github.com/atsushijike/AudioServiceそこでこのソースの動作確認をしようとしたのですが、AudioServiceクラスのdeinit内にリソース解放のためのbuffer.deallocate()が記述されています。allocatedというメッセージが出ました。試しにbuffer.deallocate()を消してみると通りましたが、bufferが解放されていないのでは無いかと思います。解放する方法を知りたいのですが、調べてもなかなか見つけることができませんでした。解決のためご助言賜りたいです。票2コードの中身を見る限り、NSDataやNSMutableDataを多用していて、とてもSwift的に綺麗なコードとは言えないですね。著者に届かないところでケチをつけてもしかたないことなんで、これ以上は控えますが。問題のエラーは解放済みの領域を再度解放(二重解放)しようとした時に表示されるものです。解放し過ぎなんですから、条件によってはbuffer.deallocate()を削除することで解消できる可能性がありますが、別の条件ではご心配いただいているように領域の解放漏れでメモリリークが生じる可能性があります。問題なのは、この行です。bytesPerPacket))NSData.init(bytesNoCopy:length:)と言うイニシャライザはbufferの所有権を引き継ぐ、つまり、bufferの解放はNSDataの側が行うので、これを一度呼び出したら、bufferを割り当てた側がその領域を解放する処理を呼び出してはいけません。malloc.(拙訳)返されたNSDataオブジェクトがbytesポインターの所有権を引き継ぎ、そのNSDataオブジェクトが廃棄(deallocation)される時にその領域をfreeで解放します。従って、bytesはmallocで割り当てられたメモリ領域を指すものでないといけません。元のコードは「mallocで割り当てられたメモリ領域を指すものでないといけません」は守っているようですが、前半の事情がわかっていないようです。このイニシャライザを呼んだ後は、自前で同じ領域を解放すると冒頭に書いたような二重解放のエラー(場合によってはうまく検出されず、重大かつデバッグ困難な不具合となります)になります。二重解放の問題はなくなります。falseと言う引数を追加することにより、所有権はNSDataの側に移らず、引き続きbufferを割り当てた側がその領域を解放する責任を持つことになります。イニシャライザとデイニシャライザが全然釣り合っていませんね。buffer.deallocate()}bufferはmallocで割り当てられているのですから、解放はfreeで行うべきです。(現在のSwiftの実装ではdeallocate()は内部でfreeを呼んでいるだけなので、動くことは動くでしょうが。)で囲んでやる必要もありません。なんで使いもしていないobjなんて引数があるのか、なんてことも解せないんですが、とりあえずそれは置いといて、以下のように描き直すべきでしょう。free(buffer)}ついでに47行、bufferは一度割り当てられたら気安く書き換えられては困るのでvarではなくletの方が良いですね。(他にもletにした方が良いものはまだありそうですが。UnsafeMutableRawPointerまだまだ、メモリ絡みで何か出てきそうな気もしますが、これ以上は本題から外れすぎるように思うので、深追いはせずに置きます。上記の修正を行えば、二重解放でのエラーは起こらなくなるはずなのでお試しください。個の銅バッジありがとうございます。swiftのAudio関係の説明について公式ドキュメントが非常にわかりにくい印象でした。ポインタあたりを正確に理解していなければならないことがわかりました。swiftのポインタについて公式ドキュメントでわかりづらい部分はやはりC言語などのポインタの基礎がわかっていないためでしょうか。普段のプログラミングではあまりポインタを意識するようなものをやらないためその辺りの知識がぼんやりしています。さん、ご返信ありがとうございます。Appleのドキュメントについてはおっしゃる通りで、私もよく「公式ドキュメント見ろ」と言う意味の回答を書くのですが、公式ドキュメントだけ見ていてもなんのこっちゃわからない、肝心なことが何も書いていない、なんてのはザラにあります。「情報源の一つ」「(何か書いてあれば)信頼すべき情報」として捉えてください。SwiftのポインタについてはC言語のポインタに精通しているかたでも、わかりにくいところがいっぱいあります。解析を含むようなオーディオ処理ではポインタは避けては通れません。AudioのC言語用APIをSwiftから使うなんて言うと、Swiftについてはかなりのベテランでも完全に正しいコードになっていることは稀です。(私も昔公開していたコードなんかには結構ポインタのやばい使い方なんかがありました。今でも残っているかも。)今回のようなテンプレ的なコード例を読むのと、公式のAPI仕様をしっかり読むのとを併行して、自分のやりたいことに近付くまで着実に覚えていかれれば良いと思います。1:16さん、ありがとうございます。datalength)としてsubscriptで取り出しているものと理解しておりますが、こういったものを先頭を削除して、後ろにデータを付け加えたいとした場合にはUnsafeBufferPointerでデータをいじっておき、NSDataに変換してNSDataをself.bufferにコピーするということを行えば、バッファの長さはそのままに、録音を続けることができますでしょうか。さん、新規の別質問の方は読ませていただいているんですが、今参考にされているプロジェクトを発展させるのは難しいだろうと言うことでコメントなり回答の形で何か書き込むのは躊躇しています。参考までにリアルタイムで音声のFFT解析他を行うApple製サンプルコード(のSwiftへの移植版)のリンクを示しておきます。若干不要な部分もあるでしょうが、リアルタイムで音の波形の解析を行いながらその結果も表示すると言うことになると、この程度の複雑さにはなると言うことで。時間が取れましたら本来のご質問の方にコメントさせていただきます。7:49@OOPerさん、ありがとうございます。OOPerさんのコードを拝読させていただき、勉強いたします。length)とInt8に直して記載していました。これではおかしな結果にならないでしょうか。Int16もしくはUInt16が正しいのかなと思ったのですが。回答スタック・オーバーフローに参加してくれて、ありがとうございます!質問の回答を共有してください。回答を説明し、自分の検討結果も共有してください。意見を述べること(意見を述べるなら、参照リソース、自分の経験で意見をサポートしてください)さらにサポートが必要な場合このヘルプを参考してください。“回答を投稿”をクリックすることで利用規約、プライバシーポリシー、及びクッキーポリシーに同意したものとみなされます。タグが付いた他の質問を参照するか、自分で質問をする。質問のフィードこのRSSフィードを購読するには、このURLをコピーしてRSSリーダーに貼り付けてください。