Pergunta

Estou usando funções de estilo C, mas eu só soube que não podem ver as variáveis ??de instância. Então, fui aconselhado a convertê-los em métodos de Objective-C.

NSString* myfunc ( int x )

torna-se:

- (NSString *)myfunc:(int)x

e

myString = myfunc(x);

se torna

myString = [myString myfunc:x];

??

Este compila com avisos ameaçadores, mas não funciona. Que tenho eu mal interpretado?

Foi útil?

Solução

Parece que sua chamada está incorreto. Talvez tente:

NSString *myString = [self myfunc:x];

Outras dicas

Tanto quanto eu entendo, você envia a mensagem -myfunc: a um objeto NSString. Assim, o método -myfunc: deve ser declarado na classe NSString (ou uma categoria de NSString).

Se é isso que você quer fazer, você não precisa voltar-se o objeto como o resultado do método: você pode modificar suas variáveis ??de instância na implementação do método. A chamada do método (ou envio de mensagem) se parece com:

[myString myfunc:x];

Se você quiser enviar a mensagem a um objeto de outra classe e retornar uma string, a sua declaração de método é correto, mas deve aparecer na sua implementação de classe eo receptor da mensagem (este é o item à esquerda na praça parênteses) deve ser dessa classe:

@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];

Como uma segunda resposta, eu estou tentando compreender seu problema através de todas as suas perguntas recentes.

Na começando , houve uma função C retornando um ponteiro para um objeto NSString:

NSString * myfunc( int x )
{
           ... // Do something with x
   NSString * myString = @"MYDATA";
           ... // Do something with myString
   return myString;        
}

Então , você queria acrescentar nessa função algum código sobre um objeto UIImage:

image1.image = [UIImage imageNamed:@"image1.png"];

Você foram aconselhados a converter a função para um método. Se você deseja acessar .image variável de instância, este método tem de pertencer à classe de objeto image1 (digamos que este é classe AlanImage). Algo parecido com isto:

@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

Terceiro , você não sabia o que era o receptor do método. Minhas investigações tendem a levar ao seu objeto image como um bom candidato:

aNiceString = [image myfunc:aNiceInteger];

Finalmente (esta questão), não obtendo uma resposta satisfatória, você reformulou sua terceira pergunta, com sucesso, desta vez como isso acontece.

Estou curioso para obter uma visão mais completa do seu projeto, a fim de dar-lhe algumas dicas. De qualquer forma, parece que você está aprendendo Objective-C e conceitos orientados a objeto: parabéns e permanecer motivado

Você não tem trabalhado para fora o que Programação Orientada a Objetos é. Com [theObject method] você só pode chamar métodos pertencentes à instância específica.

Não estou certo de que, após truque corretamente trabalho para um objetivo-c "geral", mas na implementação de maçã você pode fazer tal:

@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

Eu uso esse truque para dividir um método objc grande em funções simples privadas observáveis. Estas funções (a) fazer interface de classe não polui e (b) são invocadas mais rápido do que o método objc.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top