Я пробегаю список аргументов, хотя в этих аргументах значение может быть любым - от NSInteger, Selector до NSObjects.Но если это NSObject, его нужно правильно сохранить.Я не могу просто проверить, совпадает ли класс с NSObject или отвечает ли он на метод retain, потому что если вы сделаете это для селектора или целого числа, он просто рухнет.Так как ты все еще можешь это сделать?Понятия не имею.
Я даже пытался вставить в него @try @catch, попробуйте сохранить, если нет, то это, вероятно, объект, который не нужно сохранять.Но он тоже сразу падает :( Здесь нет исключений ошибок.
Если бы я только мог проверить, есть ли у определенного аргумента класс, если класс найден, я могу проверить, что он является классом NSObject, есликласс не найден, его также не следует сохранять. Я нашел:
object_getClass();
Но он падает, когда вы передаете ему NSInteger.
Глядя на класс NSInvocation, выможет вызвать метод retainArguments, к сожалению, это также приведет к аварийному завершению приложения. Но в описании setArgument есть кое-что странное:
Когда значение аргумента является объектом, передайте указатель на переменную (или память), из которой объект должен быть скопирован
Это означало бы, что есть «нечто», которое может определить, является ли аргумент объектом, но как?
Код(до сих пор)
- (void)addObserver:(NSObject *)observer selector:(SEL)selector arguments:(id)firstObj, ... {
// Define signature
NSMethodSignature *signature = [[observer class] instanceMethodSignatureForSelector:selector];
NSInvocation *invocation = [NSInvocation invocationWithMethodSignature:signature];
// Prepare invocation
[invocation setTarget:observer];
[invocation setSelector:selector];
id currentObject;
va_list argumentsList;
NSInteger currentIndex = 2;
if (firstObj) {
va_start (argumentsList, firstObj);
while (currentObject = va_arg(argumentsList, id)) {
[invocation setArgument:¤tObject atIndex:currentIndex];
currentIndex++;
}
va_end(argumentsList);
}
// The observer can easily be retained by doing [observer retain];
// However the arguments may consist of NSIntegers etc. which really don't like
// to be retained (logically). So I want to skip the argument that don't need
// retaining.
}
Цель
Я пытаюсь сделать следующее:
У меня есть случайный методкак:
- (void)fetchFruitApples:(NSInteger)amount inRange:(NSRange)range withString:(NSString *)aString {
//Can I fetch fruit?
//If so, execute method.
//If not wait for a certain event to occur (without blocking the main thread)
//Then retry this method with the arguments passed.
//Thats why here I want to do [MyObject addObserver:self selector:@selector(fetchFruitApples:inRange:withString:) arguments:amount, range, aString, nil];
}