Chính xác NSInvocation
hoạt động như thế nào? Có giới thiệu hay không?NSInvocation for Dummies?
Tôi đặc biệt gặp sự cố khi hiểu mã sau đây (từ Lập trình cacao cho Mac OS X, 3rd Edition) hoạt động, nhưng sau đó cũng có thể áp dụng các khái niệm độc lập với mẫu hướng dẫn. Mã:
- (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];
}
Tôi hiểu những gì nó đang cố gắng làm. (BTW, employees
là một NSArray
của lớp tùy chỉnh Person
.)
Là một .NET, tôi cố gắng kết hợp các khái niệm Obj-C và Cocoa không quen thuộc với khái niệm tương tự. Điều này có tương tự như khái niệm đại biểu của .NET không, nhưng không được nhập?
Đây không phải là 100% rõ ràng từ cuốn sách, vì vậy tôi đang tìm một cái gì đó bổ sung từ các chuyên gia thực sự Cocoa/Obj-C, một lần nữa với mục tiêu là tôi hiểu khái niệm cơ bản bên dưới ví dụ đơn giản (-ish) . Tôi thực sự tìm cách để có thể áp dụng độc lập kiến thức - cho đến chương 9, tôi đã không gặp khó khăn khi làm điều đó. Nhưng bây giờ ...
Xin cảm ơn trước!
Một sự điều chỉnh nhỏ để một câu trả lời nếu không xuất sắc ... bạn phải vượt qua một con trỏ tới các đối tượng trong 'setArgument: atIndex:', vì vậy arg chuyển nhượng thực sự nên đọc '[myInvocation setArgument: & myString atIndex: 2]'. –
@Ryan McCuaig: Cảm ơn bạn đã chỉ ra điều đó. Tôi đã thực hiện thay đổi và thêm liên kết vào tài liệu có liên quan. –
Chỉ cần làm rõ ghi chú của Ryan, chỉ mục 0 được dành riêng cho "tự" và chỉ mục 1 được dành riêng cho "_cmd" (xem liên kết e.James được đăng để biết thêm chi tiết). Vì vậy, đối số đầu tiên của bạn được đặt tại chỉ số 2, đối số thứ hai tại chỉ số 3, v.v ... –