2009-03-03 272 views
2

我一直在使用C風格的函數,但我剛剛瞭解到他們無法看到實例變量。所以我被建議將它們轉換爲Objective-C方法。Obj-C方法:使用參數調用

NSString* myfunc (int x) 

變爲:

- (NSString *)myfunc:(int)x 

myString = myfunc(x); 

變得

myString = [myString myfunc:x]; 

??

這編譯與不祥的警告,但不起作用。我誤解了什麼?

+0

你不是已經問過這個問題嗎? http://stackoverflow.com/questions/607528/calling-a-obj-c-method-with-a-parameter – Chuck 2009-03-03 19:44:04

回答

2

看起來你的電話不正確。也許嘗試:

NSString *myString = [self myfunc:x]; 
+0

[自myfunc:x]的作品!謝謝! – Alan 2009-03-03 19:48:22

0

你還沒有計算出什麼Object Oriented Programming是。用[theObject method]您只能調用屬於特定實例的方法。

+0

嗯,這是真的:) ---我盡力學習。 – Alan 2009-03-05 17:32:09

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]; 
0

我不知道,繼招正確的「一般」 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方法調用得更快。

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和麪向對象的概念:祝賀並保持動力!