2013-06-08 12 views
8

Potrzebuję użyć efektu zarysowania dla mojej gry. tutaj jest przykładowy kod lata temu.Ios zdrapki efekt karty

https://github.com/oyiptong/CGScratch

To działa dobrze, ale kiedy go używać razem z kontrolerem nawigacyjnym, to wywala.

Mój projekt używa ARC, oznaczam plik jako -fno-objc-arc. Oto kod źródłowy:

https://github.com/lifesaglitch/ScratchWithError

ulega awarii, gdy wciskam kontroler widoku, a następnie pop, a następnie ponownie.

Edit:

Podczas konwersji wszystko do łuku, a flaga kontroler widoku, który używa widoku zarysowania jako -fno-objc-łuku, to działa. Ale gdy zamiast tego oznaczysz widok scratch jako -fno-objc-arc, ponownie się zawiesi. Mój projekt używa arc i nie sądzę, że mogę przekonwertować mój kontroler widoku na -fno-objc-arc.

Edit 2:

zmodyfikować kod inicjalizacji:

scratchable = CGImageRetain([UIImage imageNamed:@"scratchable.jpg"].CGImage); 

to nie psuje już, ale nie jest to wyciek pamięci. i CGImageRelease został wywołany raz w metodzie dealloc.

+0

Bez dziennika awarii lub raport z konsulem jest to niemożliwe, aby powiedzieć, jak rozwiązać ten kod tak wygrał "t crash, chyba że ktoś ma kryształową kulę. –

+0

@CodeMonkey zaufaj mi, czasami zderzenie aplikacji bez logów – OMGPOP

+0

To logiczne, ale kod, który napisałeś, jest w porządku, chyba że możesz odtworzyć awarię i zobaczyć dziennik, że prawie niemożliwe jest wskazanie, gdzie jest problem. –

Odpowiedz

4

Użyj CGImageCreateCopy.

Powodem tego jest to, że możesz wysłać komunikat do swoich CGImageRef w swojej dealloc, ale jeśli sprawdzić rzeczywisty CGImage obiekt zobaczysz, że to wskazuje na samym adresem pamięci każdym razem (myślę, że to część optymalizacji firmy Apple, więc to tak, jakbyś miał obiekt static UIImage i odwoływał się do jego CGImage).

Więc w swojej initWithFrame: powinieneś dostać swój scratchable tak:

UIImage *sci = [UIImage imageNamed:@"scratchable.jpg"]; // This guy is always the same 
scratchable = CGImageCreateCopy(sci.CGImage); 

PS: Miałeś rzeczywisty wyciek z pixels, więc trzeba także CFRelease(pixels);

testowałem, analizowane i zmierzył kod i wydaje się, że teraz jest OK.

Here is also a link to the fixed project (Wprowadziłem również kontroler nawigacyjny i przycisk do pchania/pop) - i używa ARC oczywiście.

+0

dobrze wyjaśnione sir. – OMGPOP

0

W AppDelegate.m

[window addSubview:viewController.view]; 

Należy zamiast zastąpić go:

[window setRootViewController:viewController];