我一直在使用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] ,您只能调用属于特定实例的方法。

我不确定以下技巧是否适用于“通用” objective-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方法调用更快。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top