OBJ-C 방법 : 매개 변수로 호출
-
03-07-2019 - |
문제
C 스타일 기능을 사용하고 있지만 인스턴스 변수를 볼 수 없다는 것을 알게되었습니다. 그래서 나는 그것들을 객관적인 C 방법으로 변환하는 것이 좋습니다.
NSString* myfunc ( int x )
:
- (NSString *)myfunc:(int)x
그리고
myString = myfunc(x);
becomes
myString = [myString myfunc:x];
??
이것은 불길한 경고로 구성되지만 작동하지 않습니다. 내가 무엇을 오해 했습니까?
해결책
전화가 틀린 것 같습니다. 아마 시도 :
NSString *myString = [self myfunc:x];
다른 팁
내가 이해하는 한, 당신은 -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];
두 번째 대답으로, 나는 최근의 모든 질문을 통해 귀하의 문제를 이해하려고 노력하고 있습니다.
에서 시작, 포인터를 반환하는 C 함수가 NSString
물체:
NSString * myfunc( int x )
{
... // Do something with x
NSString * myString = @"MYDATA";
... // Do something with myString
return myString;
}
그 다음에, 당신은 그 기능을 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
제삼, 당신은 방법의 수신기가 무엇인지 몰랐습니다. 내 조사는 당신의 것으로 이어지는 경향이 있습니다 image
좋은 후보자로서 물체 :
aNiceString = [image myfunc:aNiceInteger];
마지막으로 (이 질문) 만족스러운 답변을 얻지 못하고, 당신은 이번에는 성공과 함께 세 번째 질문을 떠올 렸습니다.
나는 당신에게 힌트를주기 위해 당신의 프로젝트를보다 완전하게 볼 수 있도록 궁금합니다. 어쨌든, 당신은 객관적인 C와 객체 지향적 개념을 배우고있는 것 같습니다. 축하하고 동기 부여를 유지하십시오!
당신은 무엇을 해결하지 못했습니다 객체 지향 프로그래밍 이다. 와 함께 [theObject method]
특정 인스턴스에 속하는 메소드 만 호출 할 수 있습니다.
트릭에 따라 "일반"대상 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 방법보다 더 빨리 호출됩니다.