Obj-C方法:使用参数调用
-
03-07-2019 - |
题
我一直在使用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方法调用更快。