Методы Obj-C:вызов с параметрами
-
03-07-2019 - |
Вопрос
Я использовал функции в стиле C, но только что узнал, что они не видят переменные экземпляра.Поэтому мне посоветовали преобразовать их в методы Objective-C.
NSString* myfunc ( int x )
становится:
- (NSString *)myfunc:(int)x
и
myString = myfunc(x);
становится
myString = [myString myfunc:x];
??
Это компилируется со зловещими предупреждениями, но не работает.Что я неправильно понял?
Решение
Похоже, ваш вызов неверен.Возможно, попробуйте:
NSString *myString = [self myfunc:x];
Другие советы
Насколько я понимаю, вы отправляете -myfunc:
сообщение объекту NSString.Итак -myfunc:
метод должен быть объявлен в NSString
класс (или категория NSString
).
Если это то, что вы хотите сделать, вам не нужно возвращать сам объект как результат метода:вы можете изменить его переменные экземпляра в реализации метода.Вызов метода (или отправка сообщения) выглядит так:
[myString myfunc:x];
Если вы хотите отправить сообщение объекту другого класса и вернуть строку, объявление вашего метода правильное, но оно должно появиться в реализации вашего класса, а получатель сообщения (это элемент слева в квадратных скобках) должен быть из этого класса:
@implementation MyClass
-(NSString *)myfunc:(int)x
{
NSString * returnString;
...// do something with x, returnString and instance variables
return returnString;
}
@end;
...
MyClass * myobj = [[MyClass alloc] init];
NSString * myString = [myobj myfunc:42];
В качестве второго ответа я пытаюсь понять вашу проблему через все ваши недавние вопросы.
На начало, была функция C, возвращающая указатель на NSString
объект:
NSString * myfunc( int x )
{
... // Do something with x
NSString * myString = @"MYDATA";
... // Do something with myString
return myString;
}
Затем, вы хотели добавить в эту функцию код о UIImage
объект:
image1.image = [UIImage imageNamed:@"image1.png"];
Вам посоветовали преобразовать функцию в метод.Если вы хотите получить доступ .image
переменная экземпляра, этот метод должен принадлежать классу image1
объект (скажем, это AlanImage
сорт).Что-то вроде этого:
@interface AlanImage : NSObject {
UIImage image;
}
- (NSString *) myfuncWithParam: (int) x;
@end;
@implementation AlanImage
- (NSString *) myfuncWithParam: (int) x
{
NSString * myString = @"MYDATA";
image = [UIImage imageNamed:@"image1.png"];
return myString;
}
@end
Третий, вы не знали, что является получателем метода.Мои расследования, как правило, приводят к вашему image
возражайте как хороший кандидат:
aNiceString = [image myfunc:aNiceInteger];
Наконец (этот вопрос), не получив удовлетворительного ответа, вы переформулировали свой третий вопрос, на этот раз успешно.
Мне любопытно получить более полное представление о вашем проекте, чтобы дать вам несколько подсказок.В любом случае, похоже, вы изучаете Objective-C и объектно-ориентированные концепции:поздравляем и сохраняем мотивацию!
Вы не поняли, что Объектно-ориентированного программирования является.С [theObject method]
вы можете вызывать только методы, принадлежащие конкретному экземпляру.
Я не уверен, что следующий трюк правильно работает для «общей» цели-c, но в реализации Apple вы можете сделать это:
@interface SomeClass: NSObject {
int m_someVariable;
...
};
- (NSString *) someMethod;
...
@end
@implementation SomeClass
...
//pure c function with extra one parameter
//for accessing to instance variables
static NSString privatePlainCeeMethod(SomeClass *my, int fortyTwo) {
NSString *str;
//access to a instance variable as for a usual
//cee structure field: my->fieldName
...
return [NSString stringWithFormat:@"someVariable:%d, fortyTwo:%d",
my->m_someVariable, fortyTwo];
};
- (NSString *) someMethod {
...
return privatePlainCeeMethod(self,42);
};
...
@end
Я использую такой трюк, чтобы разделить большой метод objc на наблюдаемые частные простые функции.Эти функции (а) не загрязняют интерфейс класса и (б) вызываются быстрее, чем метод objc.