Embedded.com содержит запись из 3 частей, в которой реализован простой планировщик реального времени:
В отличие от других ответов, этот создан в виде учебника:
[ ...] в литературе мы не нашли документов, объясняющих, как реализовать новую политику планирования для Linux.
[...]
В этом документе в подробном описании [sic] мы представили все шаги, необходимые для реализации новой политики планирования.
[...]
Это простая реализация этого алгоритма планирования. Однако сложные вопросы, такие как прерывания, таймеры и многопроцессорные системы, если упомянуть некоторые, выходят за рамки этой статьи.
Поскольку вы можете вернуть только одно значение из любого в языках C и C-производных, вам просто нужно вернуть одно значение, которое представляет все ваши другие значения. Это то, что ваш пример кода делает с NSDictionary
.
Образец кода правильный, даже если он немного противоречит общепринятому стилю Objective-C.
То, что вы объявляете в файле заголовка это просто объявление метода, то есть:
@interface MyClass : NSObject
- (NSDictionary *)EndOfTurn:(int)varTurns withFatness:(int)varFatness;
@end
В исходном файле, тогда:
@implementation MyClass
// code, as given above
@end
Если у вас есть так много разных вещей, которые нужно возвращать из метода, либо инкапсулируйте их в NSDictionary, как предлагали другие, либо подумайте о том, чтобы просто определить класс. Вы можете объявить переменные экземпляра и свойства для инкапсуляции данных, если это необходимо.
Определение класса для инкапсуляции такой информации оказывается довольно эффективным и максимизирует гибкость. Если вам необходимо провести рефакторинг вашего приложения таким образом, чтобы в коллекции данных появились новые поля, которые необходимо сохранить на будущее или, возможно, потребуется расширить функциональность, класс упростит эти изменения.
А что насчет передачи значений в качестве указателей?
Например:
- (void) getValuesForInt:(int *)int1 anotherInt:(int *)int2 aBool:(BOOL *)bool1 anotherBool:(BOOL *)bool2 {
if (*int1 == 42 && *int2 == 0) {
*int1 = 0;
*int2 = 42;
}
if (*bool1 == NO) {
*bool2 = YES;
}
}
Затем вы можете вызвать его следующим образом:
int int1 = 42;
int int2 = 0;
BOOL bool1 = NO;
BOOL bool2 = NO;
[self getValuesForInt:&int1 anotherInt:&int2 aBool:&bool1 anotherBool:&bool2];
NSLog(@"int1: %d int2: %d bool1: %d bool2: %d", int1, int2, bool1, bool2);
//prints "int1: 0 int2: 42 bool1: 0 bool2: 1"
Изменить:
Это одинаково хорошо работает с объектами. Вы часто будете видеть это при работе с объектами NSError
:
NSError *error = nil;
[anObject doSomething:foo error:&error];
Может быть реализовано как:
- (void) doSomething:(id)terrible error:(NSError **)error {
if ([terrible isEqual:reallyBad]) {
if (error != nil) { *error = [NSError errorWithDomain:@"domain" code:42 userInfo:nil]; }
}
}