Jak dokładnie NSInvocation
działa? Czy jest dobre wprowadzenie?
Mam konkretnie problemy ze zrozumieniem, jak działa następujący kod (z Cocoa Programming for Mac OS X, 3rd Edition ), ale mogę również zastosować koncepcje niezależnie od przykładu samouczka. Kod:
- (void)insertObject:(Person *)p inEmployeesAtIndex:(int)index
{
NSLog(@"adding %@ to %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] removeObjectFromEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Insert Person"];
// Finally, add person to the array
[employees insertObject:p atIndex:index];
}
- (void)removeObjectFromEmployeesAtIndex:(int)index
{
Person *p = [employees objectAtIndex:index];
NSLog(@"removing %@ from %@", p, employees);
// Add inverse of this operation to undo stack
NSUndoManager *undo = [self undoManager];
[[undo prepareWithInvocationTarget:self] insertObject:p
inEmployeesAtIndex:index];
if (![undo isUndoing])
[undo setActionName:@"Delete Person"];
// Finally, remove person from array
[employees removeObjectAtIndex:index];
}
Rozumiem, co próbuje zrobić. (BTW, employees
jest klasą NSArray
niestandardową Person
.)
Będąc gościem .NET, staram się kojarzyć nieznane mi pojęcia Obj-C i Cocoa z z grubsza analogicznymi koncepcjami .NET. Czy jest to podobne do koncepcji delegata .NET, ale bez typu?
Nie jest to w 100% jasne z książki, dlatego szukam czegoś uzupełniającego od prawdziwych ekspertów od Cocoa / Obj-C, ponownie mając na celu zrozumienie podstawowej koncepcji pod prostym (-kawym) przykładem. Naprawdę chcę móc samodzielnie zastosować wiedzę - do rozdziału 9 nie miałem z tym żadnych trudności. Ale teraz ...
Z góry dziękuję!
źródło
setArgument:atIndex:
, więc przypisanie argumentu powinno faktycznie czytać[myInvocation setArgument:&myString atIndex:2]
.Oto prosty przykład NSInvocation w akcji:
Po wywołaniu -
[self hello:@"Hello" world:@"world"];
- metoda:Na koniec otrzymasz taki wydruk:
Oczywiście obiekt docelowy
self
musi nadal istnieć, aby NSTimer mógł wysłać do niego NSInvocation. Na przykład obiekt Singleton lub AppDelegate, który istnieje na czas trwania aplikacji.AKTUALIZACJA:
Jak wspomniano powyżej, kiedy przekazujesz NSInvocation jako argument do NSTimer, NSTimer automatycznie zachowuje wszystkie argumenty NSInvocation.
Jeśli nie przekazujesz NSInvocation jako argumentu do NSTimer i planujesz trzymać go przez jakiś czas, musisz wywołać jego
-retainArguments
metodę. W przeciwnym razie jego argumenty mogą zostać cofnięte przed wywołaniem wywołania, co ostatecznie spowoduje awarię kodu. Oto jak to zrobić:źródło
invocationWithMethodSignature:
używany jest inicjator, nadal musisz zadzwonićsetSelector:
. Wydaje się zbędne, ale właśnie przetestowałem i jest to konieczne.Możesz spróbować po prostu skorzystać z biblioteki tutaj, która jest znacznie ładniejsza: http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
źródło
Buduję prosty przykład wywoływania różnych typów metod za pomocą NSInvocation.
Miałem problemy z wywołaniem wielu parametrów za pomocą obj_msgSend
https://github.com/clearbrian/NSInvocation_Runtime
źródło