我一直在使用C風格的函數,但我剛剛瞭解到他們無法看到實例變量。所以我被建議將它們轉換爲Objective-C方法。Obj-C方法:使用參數調用
NSString* myfunc (int x)
變爲:
- (NSString *)myfunc:(int)x
和
myString = myfunc(x);
變得
myString = [myString myfunc:x];
??
這編譯與不祥的警告,但不起作用。我誤解了什麼?
我一直在使用C風格的函數,但我剛剛瞭解到他們無法看到實例變量。所以我被建議將它們轉換爲Objective-C方法。Obj-C方法:使用參數調用
NSString* myfunc (int x)
變爲:
- (NSString *)myfunc:(int)x
和
myString = myfunc(x);
變得
myString = [myString myfunc:x];
??
這編譯與不祥的警告,但不起作用。我誤解了什麼?
看起來你的電話不正確。也許嘗試:
NSString *myString = [self myfunc:x];
[自myfunc:x]的作品!謝謝! – Alan 2009-03-03 19:48:22
你還沒有計算出什麼Object Oriented Programming是。用[theObject method]
您只能調用屬於特定實例的方法。
嗯,這是真的:) ---我盡力學習。 – Alan 2009-03-05 17:32:09
據我所知,您發送-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];
我不知道,繼招正確的「一般」 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方法調用得更快。
作爲第二個答案,我試圖通過您最近的所有問題來理解您的問題。
在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和麪向對象的概念:祝賀並保持動力!
你不是已經問過這個問題嗎? http://stackoverflow.com/questions/607528/calling-a-obj-c-method-with-a-parameter – Chuck 2009-03-03 19:44:04