Aptallar için NSİnvocation?
Tam olarak nasıl NSInvocation
işe yarıyor mu? İyi bir giriş var mı?
Özellikle sorunları nasıl aşağıdaki kodu anlamakta güçlük çekiyorum (dan3. Mac OS X Sürümü için kakao Programlama) çalışır, ama o zaman da bu kavramlar öğretici örnek bağımsız olarak uygulayabilir. 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];
}
Yapmak istediği şeyleri alırım. (BTW, employees
NSArray
özel Person
bir sınıftır.)
Bir varlık .NET adam, kabaca paraleldir için N-C ve Kakao kavramları ilişkilendirmek bilmediğiniz için çalışıyorum .NET kavramlar. Bu benzer .NET temsilci kavramı, ama yazılmamış?
Bu değil 0 açık kitap, çok aradığım bir şey tamamlayıcı gerçek Kakao/N-C uzmanlar, yine gol anladığım kadarıyla temel kavram altında basit(-ish) örnek. Gerçekten bağımsız bölüm kadar bilgi ... hayır zorluk yaşıyordum 9, uygulayabilir bunu yapmak için arıyorum. Ama şimdi ...
Şimdiden teşekkürler!
CEVAP
38* *göre:
NSInvocation
Bir, yani bir eylem bir nesne haline getirilir statik Objective-C iletisi oluşturulur.
Ve, birküçükdaha fazla detay:
Mesaj kavramı objective-c felsefe merkezinde yer alır. Bir yöntemini çağırmak için herhangi bir zaman ya da erişim bazı değişken bir nesne, bir mesaj gönderiyorsunuz. NSInvocation
zaman içinde farklı bir noktada bir nesne için bir mesaj göndermek, ya da aynı mesajı birçok kez göndermek istediğinizde kullanışlıdır. NSInvocation
sağlartarifgöndermek için gidiyoruz mesajı, ve sonraçağırmak(aslında hedef nesne göndermek) daha sonra.
< / ^ hr .
Örneğin, diyelim ki bir dizi için bir dize eklemek istediğiniz söylüyorlar. Normalde şöyle: addObject:
mesaj gönder
[myArray addObject:myString];
< / ^ hr .
Şimdi, hadi NSInvocation
zaman: başka bir noktada bu mesajı göndermek için kullanmak istediğiniz söyleyin
İlk olarak, NSMutableArray
ile kullanım için NSInvocation
bir nesne'addObject:
s seçici: . hazırlamak istiyorsunuz
NSMethodSignature * mySignature = [NSMutableArray
instanceMethodSignatureForSelector:@selector(addObject:)];
NSInvocation * myInvocation = [NSInvocation
invocationWithMethodSignature:mySignature];
Sonraki, mesaj göndermek için hangi belirtin:
[myInvocation setTarget:myArray];
Bu nesneyi göndermek istediğiniz mesajı belirleyin:
[myInvocation setSelector:@selector(addObject:)];
Ve bu yöntem için herhangi bir bağımsız doldurun:
[myInvocation setArgument:&myString atIndex:2];
Nesne değişkenler işaretçi tarafından kabul edilmelidir unutmayın. Buna dikkat çektiğin için Ryan McCuaig teşekkür ederim Apple's documentation bakın lütfen daha fazla bilgi için.
, myInvocation
bu noktada tam bir nesne, gönderilen bir mesaj olarak nitelendiriliyor. Aslında mesaj göndermek için çağrısı:
[myInvocation invoke];
Bu son adım, mesaj, aslında [myArray addObject:myString];
yürütme gönderilecektir.
Bir e-posta göndermek gibi düşünün. Sen aç bir yeni e-posta (NSInvocation
nesne), doldurmak adresi kişi (nesne) kim ister göndermek için, yazın bir iletinin alıcı (belirtin selector
ve bağımsız değişkenler) ve ardından "gönder" (çağrı invoke
).
Daha fazla bilgi için Using NSInvocation bkz.
< / ^ hr .
NSUndoManager
o NSInvocation
nesneleri kullanırterskomutlar. Aslında, ne yapıyor oluşturma NSInvocation
nesne ki: "Hey, eğer sen de istersen Geri Al ne yaptım, bu mesajı göndermek için o nesne ile bu argümanlar". NSUndoManager
NSInvocation
nesne verin ve geri alınamaz eylemler dizisi için nesne ekler. Eğer kullanıcı"", NSUndoManager
sadece dizideki en son eylem arar ve NSInvocation
saklı nesne gerekli eylemi gerçekleştirmek için çağırır. Geri çağırırsa
Daha fazla ayrıntı için Registering Undo Operations bkz.
Aptallar için özyineleme düzenleri?...
ApartmentState Aptallar için...
Form tabanlı kimlik doğrulaması için k...
CSS metin seçimi devre dışı bırakmak i...
Href JavaScript bağlantıları için özni...