Obj-C方法:使用参数调用

时间:2009-03-03 19:34:31

标签: c objective-c function methods

我一直在使用C风格的函数,但我刚学会他们看不到实例变量。所以我被建议将它们转换为Objective-C方法。

NSString* myfunc ( int x )

变为:

- (NSString *)myfunc:(int)x

myString = myfunc(x);

变为

myString = [myString myfunc:x];

...

这会编造不祥的警告,但不起作用。我误解了什么?

5 个答案:

答案 0 :(得分:2)

看起来您的通话不正确。也许试试:

NSString *myString = [self myfunc:x];

答案 1 :(得分:1)

据我所知,您将-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];

答案 2 :(得分:1)

作为第二个答案,我试图通过你最近的所有问题来理解你的问题。

beginning,有一个C函数返回指向NSString对象的指针:

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

Then,您想在该函数中添加一些关于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

Third,你不知道该方法的接收者是什么。我的调查往往导致你的image对象成为一个好的候选人:

aNiceString = [image myfunc:aNiceInteger];

最后(这个问题),没有得到令人满意的答案,你重写了你的第三个问题,这次成功了。

我很想获得一个更完整的项目视图,以便给你一些提示。无论如何,您似乎正在学习Objective-C和面向对象的概念:祝贺并保持积极性!

答案 3 :(得分:0)

你还没有弄清楚Object Oriented Programming是什么。使用[theObject method],您只能调用属于特定实例的方法。

答案 4 :(得分:0)

我不确定以下技巧是否适用于“一般”目标-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方法。这些函数(a)不污染类接口,(b)比objc方法调用更快。