programing

목표 C: 여러 인수를 사용하여 셀렉터를 호출합니다.

easyjava 2023. 4. 14. 22:19
반응형

목표 C: 여러 인수를 사용하여 셀렉터를 호출합니다.

MyClass.m에서는

- (void) myTest: (NSString *) withAString{
    NSLog(@"hi, %@", withAString);
}

그리고 MyClass.h에 적절한 선언이 있습니다.나중에 전화하겠습니다.

[self performSelector:@selector(mytest:withAString:) withObject: mystring];

MyClass.m에서 * 예외 NSInvalidArgument로 인해종료 중과 유사한 오류가 발생함예외', 이유: '*[MyClass myTest:withAtring:]인식할 수 없는 선택기가 인스턴스 0xe421f0'으로 전송되었습니다.

나는 콘솔로 문자열을 출력하는 인수를 필요로 하지 않는 셀렉터로 더 간단한 사례를 시도했고, 그것은 잘 작동했다.코드의 문제점과 수정 방법은 무엇입니까?감사해요.

Objective-C에서 셀렉터의 서명은 다음과 같이 구성됩니다.

  1. 메서드 이름(이 경우 'myTest') (필수)
  2. 메서드에 입력이 있는 경우 메서드 이름 뒤에 ':'(콜론)이 표시됩니다.
  3. 추가 입력마다 이름과 ':'를 입력합니다.

실렉터는 다음 사항에 대해 알지 못합니다.

  1. 입력 유형
  2. 메서드의 반환 유형입니다.

performMethodsViaSelectors 메서드가 셀렉터를 통해 다른 클래스 메서드를 수행하는 클래스 구현을 다음에 나타냅니다.

@implementation ClassForSelectors
- (void) fooNoInputs {
    NSLog(@"Does nothing");
}
- (void) fooOneInput:(NSString*) first {
    NSLog(@"Logs %@", first);
}
- (void) fooFirstInput:(NSString*) first secondInput:(NSString*) second {
    NSLog(@"Logs %@ then %@", first, second);
}
- (void) performMethodsViaSelectors {
    [self performSelector:@selector(fooNoInputs)];
    [self performSelector:@selector(fooOneInput:) withObject:@"first"];
    [self performSelector:@selector(fooFirstInput:secondInput:) withObject:@"first" withObject:@"second"];
}
@end

실렉터를 작성하는 방식에는 단일 입력이 있기 때문에 다음과 같이 실렉터를 작성합니다.

SEL myTestSelector = @selector(myTest:);

메서드 시그니처는 다음과 같습니다.

- (void) myTest:(NSString *)

withAString은 파라미터입니다(이름은 오해의 소지가 있어 실렉터 시그니처의 일부인 것 같습니다).

이 방법으로 함수를 호출하는 경우:

[self performSelector:@selector(myTest:) withObject:myString];

그건 작동할 것이다.

그러나 다른 포스터에서 제안했듯이 메서드의 이름을 변경할 수도 있습니다.

- (void)myTestWithAString:(NSString*)aString;

전화:

[self performSelector:@selector(myTestWithAString:) withObject:myString];

@쉐인 아르니

performSelector:withObject:withObject:

또한 이 메서드는 최대 2개의 인수를 전달하기 위한 것으로 지연할 수 없습니다.(예:performSelector:withObject:afterDelay:).

애플은 2개의 오브젝트만 보낼 수 있고 더 범용적이지 않은 점이 좀 이상합니다.

코드에는 두 가지 문제가 있습니다.하나는 확인되었고, 다른 하나는 그렇지 않았다.첫 번째는 셀렉터의 파라미터 이름이 누락되어 있는 것입니다.그러나 수정된 메서드 서명에 여러 개의 인수가 포함되어 있다고 가정할 때 이 행은 여전히 예외를 발생시킵니다.수정된 방법이 다음과 같이 선언되었다고 가정합니다.

-(void)myTestWithString:(NSString *)sourceString comparedTo:(NSString *)testString ;

여러 인수를 사용하는 메서드의 실렉터를 작성하는 것은 완전히 유효합니다(예를 들어 @selector(myTestWithString:comparedTo:).단, performSelector 메서드에서는 myTest에 1개의 값만 전달할 수 있습니다.myTest에는 유감스럽게도 파라미터가 여러 개 있습니다.오류가 발생하여 충분한 값을 제공하지 않았음을 알 수 있습니다.

수집은 파라미터에 불과하므로 언제든지 메서드를 재정의할 수 있습니다.

-(void)myTestWithObjects:(NSDictionary *)testObjects ;

그러나 리팩터링이 필요 없는 보다 우아한 솔루션이 있습니다.은 NSInvocation과 NSInvocation을 입니다.setArgument:atIndex: ★★★★★★★★★★★★★★★★★」invoke★★★★★★★★★★★★★★★★★★.

자세한 내용을 원하시면 코드 예시를 포함한 기사를 작성했습니다.스레드에 중점을 두고 있지만 기본은 여전히 적용됩니다.

행운을 빕니다.

메서드 서명이 의미가 없습니다. 오타가 아닌 것이 확실합니까?그게 어떻게 집계됐는지도 확실치 않지만, 혹시 당신이 무시하고 있다는 경고를 받고 있는 건 아닐까요?

이 메서드에 필요한 파라미터는 몇 개입니까?

클래스는 다음과 같이 정의해야 합니다.

- (void) myTestWithSomeString:(NSString *) astring{
    NSLog(@"hi, %s", astring);
}

파라미터는 1개뿐이므로 1개만 사용할 수 있습니다.

NSLog에서 %@를 사용하는 것도 고려할 수 있습니다.이것은 좋은 습관입니다.그러면 문자열뿐만 아니라 오브젝트도 쓸 수 있습니다.

안드로이드 개발자가 2021_10_15에 게시합니다.

(OC는 사용하기 더 어렵습니다. -_-||)

여러 인수를 사용하여 셀렉터를 호출하는 중,

하면 .NSObject performSelector:withObject:withObject ,

지원만 두 개의 인수를 전달합니다!!!

, 하다, 하다, 하다'는 할 수 있습니다.performSelector withObject X 3타타에 objc_msgSend★★★★★★ 。

#include <objc/message.h>

- (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2 withObject:(id)object3 {
    typedef id (*send_type)(id, SEL, id, id, id);
    send_type func = (send_type) objc_msgSend;
    id retValue = func(self, aSelector, object1, object2, object3);
    return retValue;
}

사용방법:

- (NSString *)ObjcMsgSendWithString:(NSString *)string withNum:(NSNumber *)number withArray:(NSArray *)array {
    NSLog(@" ---> %@, %@, %@", string, number, array[0]);
    return @"return 311";
}

- (void)test{
    NSString *str = @"字符串objc_msgSend";
    NSNumber *num = @20;
    NSArray *arr = @[@"数组值1", @"数组值2"];

    SEL sel = @selector(ObjcMsgSendWithString:withNum:withArray:);
    NSLog(@"1223 ---> %@", [self performSelector:sel withObject:str withObject:num withObject:arr]);
}

iOS 사용자는 또한 자동 자본화를 예상합니다.표준 텍스트 필드에서는 대소문자를 구분하는 언어의 문장의 첫 글자가 자동으로 대문자로 표시됩니다.

이러한 기능의 실장 여부는 사용자가 결정할 수 있습니다.이러한 기능에는 전용 API가 없기 때문에 이러한 기능을 제공하는 것이 경쟁상의 우위입니다.

Apple 문서에서는 이 기능 및 커스텀키보드에서 예상되는 일부 기능에 사용할 수 있는 API가 없다고 합니다.그러니까 이걸 구현하려면 자기만의 논리를 찾아야 돼요.

언급URL : https://stackoverflow.com/questions/1018195/objective-c-calling-selectors-with-multiple-arguments

반응형