ARC, -fno-objc-arc dosyasını işaretlemesine rağmen yapılarda veya birliklerde Objective-C nesnelerini yasaklar


85

ARC, -fno-objc-arc? Dosyasını işaretlemelerine rağmen yapılarda veya birliklerde Objective-C nesnelerini yasaklar. Bu neden böyle?

Bunu -fno-objc-arc olarak işaretlerseniz bu kısıtlamaya sahip olmadığınızı varsaymıştım.

Yanıtlar:


170

Bu mesajı aldıysanız __unsafe_unretained'ı deneyin. Yalnızca yapıdaki nesneler tutulmamışsa güvenlidir. Örnek: ARC ile OpenFeint kullanırsanız, OFBragDelegateStrings Sınıfı bu hatayı bir yapı içinde söyler.

typedef struct OFBragDelegateStrings
{
     NSString* prepopulatedText;
     NSString* originalMessage;
} OFBragDelegateStrings;

-e

typedef struct OFBragDelegateStrings
{
     __unsafe_unretained NSString* prepopulatedText;
     __unsafe_unretained NSString* originalMessage;
} OFBragDelegateStrings;

4
aynı zamanda dizeyi tahsis ettiğimde sorun yaratıyor, tutulan nesneyi unsafe_unretained değişken nesnesine atarken uyarı gösteriyor atamadan sonra serbest bırakılacak. Ve kullandığımda çöküyor
Deepak Singh Negi

8
Bu, tüm sorunları çözmez, nesne normalde hemen serbest bırakılır ve bu nedenle kullanılamaz.
Diziet

evet - bu aslında işe yaramıyor ... çözüm, henüz
çözemediğim

1
Bunu, derleme aşamasında dosyaya -fno-objc-arc bayrağını ekleyerek yaparsınız.
Abizern

Yapı alanı yalnızca "aptal bir referans" ise ve nesne aslında başka bir yerde (örneğin, bir içinde) alıkonuluyorsa (sahipleniliyorsa NSArray)? Bu durumda, hemen kaldırılmayacaktır, ancak derleyicinin ne söyleyeceğini merak ediyorum (şu anda test edemiyorum) ...
Nicolas Miari

30

Aksine bir kullanmaktan daha yapı , bir oluşturabilir Objective-C sınıfı yerine verileri yönetmek için.


Nasıl? numune nerede?

Öyleyse neden küçük kullanım durumları için yapılandırılamıyor?
Devanshu Saini

13

Bunun nedeni, arkın yapılardaki veya birleşimlerdeki nesneleri izleyememesidir (çünkü bunlar bu noktada düz C işaretçileridir).

Söz konusu dosyayı / sınıfı işaretlemiş olsanız bile, -fno-objc-arcyine de ark ile kontrol edilen bir nesneyi parametre olarak ona iletebilirsiniz, bu da büyük olasılıkla bir bellek sızıntısına neden olur.


Ama sonra projelerimde ark ve ark olmayan dosyaları nasıl kullanabileceğim. Örneğin, sharekit'i ark dışı olarak kullanıyorum ve yayınlamak için örnekleri kullanabiliyorum. Kullandığım dosyalar arc dosyaları.
Zsolt

-fno-objc-arcARC ve ARC olmayan dosyaları bir proje içinde karıştırmak için kullanabilirsiniz , ancak herhangi bir yerde struct veya union gibi düz C yapıları kullanıyorsanız, ARC'yi hiç kullanamazsınız.
voidStern

Teşekkürler voidStern .. "ama eğer struct veya union gibi düz C yapılarını herhangi bir yerde kullanıyorsanız, ARC'yi hiç kullanamazsınız." - Bunun doğru olduğunu sanmıyorum. ARC'yi kendi dosyalarım için kullanıyorum. Ve libharu dosyaları için ark dışı. Asıl sorunumun üstesinden gelme şeklim, değerleri ayrı ayrı C dosyasına aktarmak ve orada yapıyı oluşturmaktı. Bence anahtar, arktan ark olmayana atlamadır.
Zsolt

1
Hiç de biraz abartılı olabilir. Temelde, ARC'nin kafasını karıştıracak şekilde, yapılara ve birliklere nesnelere işaret koyamazsınız. Yapılar ve / veya birliklerle düz bir C kitaplığı kullanmak (genellikle) mümkün olmalıdır.
voidStern

6

Görünüşe göre bu artık hatasız çalışıyor, muhtemelen bu değişiklikten sonra .

Yani, bir C yapısındaki Objective-C nesnelerine normal (güçlü) işaretçiler koyabilirsiniz. ARC tarafından yönetilir, örneğin yapı yıkıldığında tutulmaz. Şununla doğrulandı:

$ clang --version Apple LLVM version 10.0.0 (clang-1000.11.45.2)


Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.