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
Ben objektif-C Dizilerin yükü göze alamaz ve
:
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ı, nesnelerNSArray
'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;
ARC işaret ediyor kod satırı nerede? –
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 ... –
Merak ediyorum, bazı dökümler Xcode'un otomatik düzeltme özelliği tarafından 'önerildi', ancak bazıları sadece hata olarak işaretlendi. –