Методы Obj-C: вызов с параметрами - PullRequest
2 голосов
/ 03 марта 2009

Я использовал функции в стиле C, но я только что узнал, что они не могут видеть переменные экземпляра. Поэтому мне посоветовали преобразовать их в методы Objective-C.

NSString* myfunc ( int x )

становится:

- (NSString *)myfunc:(int)x

и

myString = myfunc(x);

становится

myString = [myString myfunc:x];

??

Это компилируется со зловещим предупреждением, но не работает. Что я неправильно понял?

Ответы [ 5 ]

2 голосов
/ 03 марта 2009

Похоже, ваш звонок неверный. Возможно попробуйте:

NSString *myString = [self myfunc:x];
1 голос
/ 04 марта 2009

В качестве второго ответа я пытаюсь понять вашу проблему через все ваши последние вопросы.

В начале была функция 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 class). Примерно так:

@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 и объектно-ориентированные концепции: поздравляйте и оставайтесь мотивированными!

1 голос
/ 03 марта 2009

Насколько я понимаю, вы отправляете сообщение -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];
0 голосов
/ 04 марта 2009

Я не уверен, что следующий трюк правильно работает для «общего» объектива-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.

0 голосов
/ 03 марта 2009

Вы еще не поняли, что такое Объектно-ориентированное программирование . С [theObject method] вы можете вызывать только методы, принадлежащие конкретному экземпляру.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...