【问题标题】:Obj-C methods: calling with parametersObj-C 方法:带参数调用
【发布时间】:2010-10-11 02:29:33
【问题描述】:

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

NSString* myfunc ( int x )

变成:

- (NSString *)myfunc:(int)x

myString = myfunc(x);

变成

myString = [myString myfunc:x];

??

编译时会出现不祥的警告,但不起作用。我误会了什么?

【问题讨论】:

标签: c objective-c function methods


【解决方案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 和面向对象的概念:恭喜并保持动力!

【讨论】:

    【解决方案2】:

    我不确定以下技巧是否适用于“通用”objective-c,但在苹果实现中您可以这样做:

    @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 方法快。

    【讨论】:

      【解决方案3】:

      据我了解,您将 -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];
      

      【讨论】:

        【解决方案4】:

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

        【讨论】:

          【解决方案5】:

          看来您的调用不正确。也许试试:

          NSString *myString = [self myfunc:x];
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-03-05
            • 1970-01-01
            • 1970-01-01
            • 2013-04-26
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-02-11
            相关资源
            最近更新 更多