ARC

2012-06-22 22 views
10

altında Objective-C nesnelerine işaretçi C-stil dizisi Bir oyun ızgarasında oyun nesnelerini takip etmek için Objective-C örneklerine 2B dizi işaretçim var. Şimdi kodumu ARC'ye geçiriyorum ve Xcode hatayı işaret etti. Nesnelerin göstericilerinin yapı üyeleri olarak kullanılmasına izin verilmediğini biliyordum, ancak bu kişi beni (neredeyse) nöbet tuttu. Nesneleri ızgara nesneleri ararkenARC

  1. Ben objektif-C Dizilerin yükü göze alamaz ve

  2. :

    Ben ARC kısıtlamayla ardında yatan mantığı anlamak, ancak Kendileri zaten bir ivar olarak C-tipi ızgaraya sahip olan aynı sınıfta tanımlanan bir NSArray ivar'a aittir; c stili dizi sadece uygun bir yapılandırılmış kısayoldur. Dahası, nesneler NSArray'dan çıkarıldığında, ilgili ızgara yuvasını NULL'a ayarlıyorum. olduğu

, 2D array (ızgara) güvenle başka bir yerde tutulan nesnelere hızlı (ama dilsiz) işaretçiler (NSArray ivar) sadece bir koleksiyon.

Oyuncular kullanarak bu oyundan kurtulmanın bir yolu var mı? Örneğin, tanımlama ve benim ızgara Alloc:

void*** _grid; 

yerine

MyMapObjectClass*** _grid 

ve (uygun köprülü) kullanımı ile yok eder void* < ->MyMapObjectClass* ayarlama ya da her bir yuvaya işaretçiler alırken?

DÜZENLEME: Yani burada ben yukarıda açıklandığı gibi ben ivar beyanı değişti o

çözüldü nasıl. Buna ek olarak, benim benzerim kadar ızgarasının bir girdi ayarlarken, benim yaptığımı:

MyMapObjectClass* object = (__bridge MyMapObjectClass*) _grid[x][y]; 

[object performSomeMethod]; 

// etc... 

çıkarma:

// (Done **Only Once** at map initialization) 
// _objectArray is an instance of NSMutableArray 

MyMapObjectClass* mapObject = [[MyMapObjectClass alloc] init]; 

// ...configure map object, etc... 

// Add to Obj-C array: 
[_objectArray addObject:mapObject]; 

// Add pointer to 2D C array: 
_grid[i][j] = (__bridge void*)mapObject; 

(x, y) nesne erişen, ben tam tersini yapmak haritadan nesne, bunu:

MyMapObjectClass* object = (__bridge MyMapObjectClass*) _grid[x][y]; 

[_objectArray removeObject:object]; 

_grid[x][y] = NULL; 

Harita nesneleri oyun ilerleme göre oyunun başında bir kez oluşturulur ve kaldırılır. Ben başka bir harita nesnesi yerine gerekiyorsa, bunu yapacağımı:

MyMapObjectClass* oldObject = (__bridge MyMapObjectClass*) _grid[x][y]; 
// (should mark as weak?) 

[_objectArray removeObject:oldObject];  
_grid[x][y] = NULL; 

MyMapObjectClass* newObject = [[MyMapObjectClass alloc] init]; 

[_objectArray addObject:newObject]; 

_grid[x][y] = (__bridge void*)newObject; 
+0

ARC işaret ediyor kod satırı nerede? –

+0

Xcode, tüm hataları bir kerede değil, 4-12. Bazıları tamir edersiniz, sıradakiler aşağıdaki kontrolde görünür. İlk hata C-dizisinin ivar beyanında ortaya çıktı. Ve şimdi, obj-c pointer ve void * arasındaki her atama veya karşılaştırma sinyali verildi. Şu an bunu düzeltiyorum, ve sanırım şu işe yarayacak bir İngiliz köprüsü var ... –

+0

Merak ediyorum, bazı dökümler Xcode'un otomatik düzeltme özelliği tarafından 'önerildi', ancak bazıları sadece hata olarak işaretlendi. –

cevap

2

engellemeyi ARC kullanarak kalıplar genellikle kötü bir fikirdir. Map.m için disable ARC için daha iyi bir yol olurdu (ya da sadece arama bölümünü ayrı bir sınıfa ayırın) .O zaman içinde retain/release ve beğendiğiniz C yapıları ile manuel bellek yönetimi yapın. doğru düzgün çalışır ve iç içe NSArrays vb overhead kaçınarak, diğer sınıflardan çağırabilirsiniz mümkün olacak ...

+0

__unsafe_unretained. Ben sadece __bridge kullanarak ARC'yi engellemiyorum; sorun olmamalı. NSArray ve C dizisini eşitlemede tutuyorum. Nesneler NSArray (ARC başına) tarafından tutulur. İşaretçi sarkma tehlikesi yoktur. –

+1

Temizlemek gerekirse: Nesnelerimin% 100 Objective-C,% 100 ARC'si olan ARC dostu bir NSArray'ım var. ** Buna ek olarak, bir satır/sütun biçiminde nesnelerime hızlı erişim elde etmek için bir 'tablo bul' var. Bir zombi kaldırılması önlemek için NSArray (ayrılan alır) bir nesneyi kaldırdığımda, tablo girdileri NULL doğru güncelleştirilir. –

+2

Yine de, bu dosyayı ayrı bir dosyaya dahil etmenizi ve bu dosya için ARC'yi devre dışı bırakmanızı öneririm, çünkü bu daha geleceğe yönelik bir çözümdür. Apple hiç bir zaman semantiği değiştirmeye karar verirse, kabataslak oyuncular için derleme hataları ile sonuçlanmayacaksınız. Çözümünüz yine de işe yarayacak. –