2016-07-04 60 views
6

Biraz kafam karıştı. Ne zaman ücretsiz ve ne zaman yok/dealloc çağırmalıyım? Ben çekirdek ses öğrenme kısa kod snippet üzerinde çalışıyorum. UnsafeMutablePointer<Type>.alloc(size)'u aradığımda, destroy & dealloc'u aramam gerektiğini düşündüm. Ama malloc() veya calloc() kullanıyorsam, free()'u aramam gerekiyor. Aşağıdaki kod parçası yapar Öğrenme Core Audio Bu örnekte UnsafeMutablePointer düzgün bir şekilde nasıl kullanılır

beni merak:
var asbds = UnsafeMutablePointer<AudioStreamBasicDescription>.alloc(Int(infoSize)) 
audioErr = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, 
           UInt32(sizeof(fileTypeAndFormat.dynamicType)), &fileTypeAndFormat, 
           &infoSize, asbds) 

Burada alloc kullanın. Belleği boşaltmak için free çağrılır.

free(asbds) 

Ama neden

asbds.destroy(Int(infoSize)) 
asbds.dealloc(Int(infoSize)) 

Ben kural aşağıdaki beklenebilir ki.

Herhangi bir yardım için minnettarım, çünkü bu benim baş döndürür. Dokümantasyon, parçaların net, ancak bu şekilde nasıl tahrip edilmesinden ve dürüstlükten sorumlu olduğumu söylüyor.

cevap

1

UnsafeMutablePointer Structure Reference'a bakın.

gösterici, aşağıdaki durumlardan birinde olabilir:

  • bellek tahsis değildir (örneğin işaret null veya hafıza, daha önce ayırmanın).

  • Bellek ayrıldı, ancak değer başlatılmamış.

  • Bellek ayrıldı ve değer başlatıldı. "Tahsis başlatıldı" ne zaman

güvenle sivri bölgeyi kullanabilirsiniz. Eğer Swift'in UnsafeMutablePointer'u doğru kullanmak istiyorsanız, kullanmadan önce 2 adım ve kullandıktan sonra 2 adım gerekir.

(1) Ayırma: alloc(_:).

(2) Initilize: initialize...()

güvenle Burada ayrılmış ve başlatılmış bölgeyi kullanabilirsiniz.

(3) Deinitialize: destroy(_:)

(4) ayırması: dealloc(_:)


Ve alloc(_:) ed bellek için free() kullanabilirsiniz neden Swift alloc(_:) geçerli uygulanmasında malloc(_:) kullanması nedeniyle, bu. Dolayısıyla, ücretsiz kullanmak, uygulamanızın Swift çalışma zamanının güncel uygulamasına bağlı olduğu anlamına gelir.


Yani, UnsafeMutablePointer kullanarak tür zor ve can sıkıcı. Bir diziyi işaretçi olarak geçirmeyi düşünmelisiniz.

let elementCount = Int(infoSize)/strideof(AudioStreamBasicDescription) 
    var asbds: [AudioStreamBasicDescription] = Array(count: elementCount, repeatedValue: AudioStreamBasicDescription()) 
    audioErr = AudioFileGetGlobalInfo(kAudioFileGlobalInfo_AvailableStreamDescriptionsForFormat, 
            UInt32(sizeof(fileTypeAndFormat.dynamicType)), &fileTypeAndFormat, 
            &infoSize, &asbds) 

(.. Ben UnsafeMutablePointer kullanırken bile bu elementCount kullanmak gerektiğini düşünüyorum alloc(_:) veya dealloc(_:) "elemanların sayısını" değil "bayt boyutu" kullanır)

: Senin durumunda , böyle bir şey yazabilirsiniz
+0

Çok teşekkür ederim. Bu çok yardımcı oldu. Dizi yaklaşımını çok seviyorum, bu da işleri çok daha hızlı bir hale getiriyor. Ama 'free() 'bölümünü benim için temizledim. Şu anda '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' '' Bunu doğru mu anladım? Çünkü 'Tahsis' perdelerin ardında 'malloc' diyor. – enovatia