Bagaimana tepatnya cara NSInvocation
kerjanya? Apakah ada pengantar yang bagus?
Saya secara khusus mengalami masalah memahami bagaimana kode berikut (dari Pemrograman Kakao untuk Mac OS X, Edisi ke-3 ) bekerja, tetapi kemudian juga dapat menerapkan konsep-konsep secara independen dari sampel tutorial. Kode:
- (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];
}
Saya mendapatkan apa yang ingin dilakukan. (BTW, employees
adalah kelas NSArray
khusus Person
.)
Menjadi seorang. NET guy, saya mencoba mengaitkan konsep Obj-C dan Cocoa yang tidak dikenal dengan konsep .NET. Apakah ini mirip dengan konsep delegasi .NET, tetapi tidak diketik?
Ini tidak 100% jelas dari buku ini, jadi saya mencari sesuatu tambahan dari pakar Kakao / Obj-C yang asli, lagi-lagi dengan tujuan agar saya memahami konsep dasar di bawah contoh sederhana (-ish). Saya benar-benar ingin dapat mengaplikasikan pengetahuan secara mandiri - sampai bab 9, saya tidak mengalami kesulitan melakukan itu. Tapi sekarang ...
Terima kasih sebelumnya!
sumber
setArgument:atIndex:
, sehingga tugas arg harus benar-benar membaca[myInvocation setArgument:&myString atIndex:2]
.Berikut adalah contoh sederhana dari NSInvocation in action:
Ketika dipanggil -
[self hello:@"Hello" world:@"world"];
- metode akan:Pada akhirnya, Anda akan mendapatkan hasil cetakan seperti:
Tentu saja, objek target
self
harus tetap ada untuk NSTimer untuk mengirim NSInvocation ke sana. Misalnya, objek Singleton , atau AppDelegate yang ada selama aplikasi.MEMPERBARUI:
Seperti disebutkan di atas, ketika Anda melewatkan NSInvocation sebagai argumen ke NSTimer, NSTimer secara otomatis mempertahankan semua argumen NSInvocation.
Jika Anda tidak meneruskan NSInvocation sebagai argumen ke NSTimer, dan berencana untuk menggunakannya sebentar, Anda harus memanggil
-retainArguments
metodenya. Kalau tidak, argumennya dapat dibatalkan alokasi sebelum pemanggilan dipanggil, akhirnya menyebabkan kode Anda mogok. Inilah cara melakukannya:sumber
invocationWithMethodSignature:
initializer digunakan, Anda masih perlu meneleponsetSelector:
. Tampaknya berlebihan, tetapi saya baru saja menguji dan itu perlu.Anda dapat mencoba hanya menggunakan perpustakaan di sini yang jauh lebih bagus: http://cocoawithlove.com/2008/03/construct-nsinvocation-for-any-message.html
sumber
Saya membangun contoh sederhana memanggil berbagai tipe metode dengan NSInvocation.
Saya mengalami masalah memanggil beberapa param menggunakan obj_msgSend
https://github.com/clearbrian/NSInvocation_Runtime
sumber