2009-03-03 10 views
2

C 스타일의 함수를 사용했지만 인스턴스 변수를 볼 수 없다는 것을 배웠습니다. 그래서 나는 그것들을 Objective-C 방법으로 변환하도록 권고 받았다.Obj-C methods : 매개 변수를 사용하여 호출

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

답변

2

전화가 잘못되었습니다. 아마도 시도해보십시오 :

+0

[self myfunc : x] works! 감사! – Alan

0

Object Oriented Programming은 해결되지 않았습니다. [theObject method]을 사용하면 특정 인스턴스에 속한 메소드 만 호출 할 수 있습니다.

+0

글쎄, 그건 사실이야 :) --- 나는 배우려고 노력하고 있습니다. – Alan

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

나는 다음과 같은 트릭을 올바르게 "일반"목표 - 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에서

가하는 NSString 객체에 대한 포인터를 반환하는 C 함수가 있었다 :

image1.image = [UIImage imageNamed:@"image1.png"]; 
:

NSString * myfunc(int x) 
{ 
      ... // Do something with x 
    NSString * myString = @"MYDATA"; 
      ... // Do something with myString 
    return myString;   
} 

Then, 당신은 UIImage 객체에 대해 그 기능에 약간의 코드를 추가하고 싶었

함수를 메서드로 변환하는 것이 좋습니다..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 및 객체 지향 개념을 배우는 것 같습니다. 축하와 동기 부여!

관련 문제