Obecnie próbuję zaimplementować system poolingu, mam cały kod, po prostu nie rozumiem, dlaczego pewna jego część nie działa.
Mam tablicę c tablicy NSMutable wykonaną w ten sposób:
NSMutableArray *poolArray[xSize][ySize];
for (int n = 0; n < xSize; n++)
{
for (int m = 0; m < ySize; m++)
{
poolArray[n][m] = [[NSMutableArray alloc] init];
}
}
I próbując uzyskać do niego dostęp, otrzymuję współrzędne x i y puli i obiektu i próbuję dodać to w ten sposób:
[poolArray[x][y] addObject:object]; //This raises a EXC_BAD_ACCESS error
Jestem całkowicie otwarty na edycję tego, jak to piszę - zdaję sobie sprawę, że mógłbym zadeklarować NSMutableArray i użyć indeksów ((y * szerokość) + x) i być może będę musiał przepisać kod w ten sposób. Ale najlepiej nie chcę tego robić, ponieważ chcę tylko tworzyć tablice, których używam, więc coś takiego:
if (poolArray[x][y] == nil) poolArray[x][y] = [[NSMutableArray alloc] init];
[poolArray[x][y] addObject:object];
Jest tak, że może mieć „dziury”, więc nie muszę nic robić w poolArray[2][3], na przykład, jeśli nic tam nie ma.
Nie wiem, czy i tak mógłbym to przepisać za pomocą typów obiektywnych-c, ale jeśli to zrobię, jestem zmuszony do dalszego tworzenia NSMutableArray w każdym miejscu, powodem, dla którego nie chcę tego robić, jest to, że chcę uzyskać z systemu każdą odrobinę wydajności, jaką mogę.
Dziękujemy za poświęcenie czasu na przeczytanie tego, a każda odpowiedź jest mile widziana :)
2 odpowiedzi
Nie widzę nic złego w dostarczonym przez Ciebie kodzie, chociaż kilka pomysłów:
W przypadku, gdy sprawdzasz poolArray[x][y] == nil, czy rzeczywiście zresetowałeś wszystkie wartości do nil podczas inicjalizacji tablicy?
Alternatywą, która powinna działać, jest przechowywanie tablicy na stercie. Możesz użyć calloc (który zainicjuje pamięć do 0) lub malloc i memset.
Powinno działać:
NSMutableArray ***poolArray = calloc(xSize * ySize, sizeof(NSMutableArray *));
if (poolArray[x][y] == nil) poolArray[x][y] = [[NSMutableArray alloc] init];
[poolArray[x][y] addObject:object];
To działa dla mnie:
#import <Foundation/Foundation.h>
#define xSize 10
#define ySize 10
int main (int argc, const char * argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
NSMutableArray *poolArray[xSize][ySize];
for (int n = 0; n < xSize; n++)
{
for (int m = 0; m < ySize; m++)
{
poolArray[n][m] = [[NSMutableArray alloc] init];
}
}
[poolArray[2][3] addObject: @"Hello"];
[poolArray[2][3] addObject: @"world!"];
NSLog(@"poolArray[2][3] objects: %@ %@",
[poolArray[2][3] objectAtIndex: 0],
[poolArray[2][3] objectAtIndex: 1]);
[pool drain];
return 0;
}
(Tak, wiem, powinienem zwolnić wszystkie instancje NSMutableArray. Pominięto dla zwięzłości).
Jest więc kilka rzeczy, które powinieneś sprawdzić:
- Czy
object
jest prawidłowym obiektem, tj. czy został zainicjowany?NSMutableArray
spróbujeretain
obiektu, a jeśli nigdy nie został zainicjowany, zakończy się niepowodzeniem lub jeśli został jużdealloc
-edytowany, również się nie powiedzie. - czy
x
iy
są ważne? Możesz łatwo przekroczyć granice i tego nie zauważyć.
Podobne pytania
Nowe pytania
objective-c
Tego znacznika należy używać tylko w przypadku pytań dotyczących funkcji Objective-C lub zależnych od kodu w języku. Tagi [cocoa] i [cocoa-touch] powinny być używane, aby zapytać o ramy lub klasy Apple. Użyj powiązanych tagów [ios], [macos], [apple-watch] i [tvos] w przypadku problemów specyficznych dla tych platform.