Вопрос

Я использовал функции в стиле 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.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top