我一直在使用C风格的函数,但我刚学会他们看不到实例变量。所以我被建议将它们转换为Objective-C方法。
NSString* myfunc ( int x )
变为:
- (NSString *)myfunc:(int)x
和
myString = myfunc(x);
变为
myString = [myString myfunc:x];
...
这会编造不祥的警告,但不起作用。我误解了什么?
答案 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方法调用更快。