이것은 객관적인 질문입니다.인스턴스화 된 객체없이 메서드를 호출하는 방법
개체에서 메서드를 호출하고 싶습니다. 그러나 개체의 인스턴스화는 없습니다. 이것이 가능한가?
호출하려는 메서드는 클래스 메서드가 아닙니다.
이것은 객관적인 질문입니다.인스턴스화 된 객체없이 메서드를 호출하는 방법
개체에서 메서드를 호출하고 싶습니다. 그러나 개체의 인스턴스화는 없습니다. 이것이 가능한가?
호출하려는 메서드는 클래스 메서드가 아닙니다.
아마도 평범한 C 함수를 원할 수도 있습니다. 클래스 메소드를 원하지 않고 인스턴스 메소드가 필요하지 않은 경우 유일한 옵션 인 것 같습니다. Objective-C에서 C 함수를 사용하는 것을 두려워하지 마십시오. 모든 기술에는 그 자리가 있습니다.
방법이 static
이 아닌 한이 작업을 수행 할 수 없습니다. Objective-C의 static
루틴 앞에 +
이 붙습니다.
+ (id)alloc; // static - an NSObject instance is not required
- (NSString*)description; // nonstatic - an NSObject instance is required
하나는과 같이 각각의 통화를 할 것입니다 :
NSObject* result = [NSObject alloc];
NSString* desc = [result description];
존재하지 않는 객체의 메소드를 호출 할 수 없습니다 예를 들어 NSObject의은 (많은 중)이 두 루틴을 제공 . 그러나 클래스의 메소드를 호출 할 수 있습니다. 클래스의 인스턴스화 된 객체가없는 경우에도 마찬가지입니다. (alloc이 @fbrereton의 대답 인 클래스 메소드이다.
클래스 메서드는 - 대신 +로 정의되고 정의되며 인스턴스가 아닌 클래스에서 호출되며 클래스의 자체 또는 인스턴스 변수에 액세스 할 수 없습니다 (이유가 분명해야 함).
이 언어로이 "고정 방법"을 사용 하시겠습니까? –
@ Objective-C에서 @ d03boy 우리는 이러한 "클래스"메서드를 호출하지만 다른 언어에서 사용되는 정적 메서드와 기능적으로 동일합니다. –
개체 -c 클래스는 인스턴스와 마찬가지로 실제 개체이기 때문에이 메서드는 정적 메서드 이상입니다. 예를 들어 - [NSArray 배열] 메서드는 수신기의 인스턴스를 반환한다는 점에서 동적입니다.[NSMutableArray array]는 배열이 변경 가능하지만 NSMutableArray는 해당 메서드를 재정의 할 필요가 없습니다. 다음과 같은 메소드를 구현하면됩니다 : "return [[[self alloc] init] autorelease]". 그것은 '자기'는 NSMutableArray를, 다른 NSArray는 다른 NSMutableArray이기 때문에 효과가 있습니다. 따라서 objective-c에서 다형성 클래스 메소드를 가질 수 있습니다. –
인스턴스 메소드가 실제로는 클래스 메소드 (인스턴스 변수에 액세스하지 않음) 인 경우 인스턴스 메소드를 실제로 호출 할 수 있습니다. 다음은 예입니다 :
당신은 작업을하는 것이 메모리를 할당하여 인스턴스 메소드는 인스턴스 변수에 액세스하는 경우에도 작업을 얻을 수/*
Compile with:
gcc -framework Foundation inst_method_without_inst.m -o inst_method_without_inst
*/
#import <Foundation/Foundation.h>
#import <objc/runtime.h>
@interface Foo : NSObject {
}
- (BOOL)doSomethingWithThis:(NSString *)this;
@end
@implementation Foo
- (BOOL)doSomethingWithThis:(NSString *)this {
NSLog(@"Look, it's this: %@", this);
return YES;
}
@end
typedef BOOL (*my_sel_t)(id, SEL, NSString *);
int
main(void) {
Class cls = [Foo class];
SEL my_sel = @selector(doSomethingWithThis:);
Method m = class_getInstanceMethod(cls, my_sel);
// You could also use +[NSObject instanceMethodForSelector:] to get |m|,
// since |cls| is a kind of NSObject.
my_sel_t f = (my_sel_t)method_getImplementation(m);
BOOL result = f(nil, my_sel, @"Hello from an instanceless instance method invocation!");
NSLog(@"result: %d", (int)result);
return EXIT_SUCCESS;
}
(사용 중 +alloc
또는 class_getInstanceSize()
플러스 malloc()
) 그 메모리로의 포인터를 전달 첫 번째 id
nil
대신 구현에 인수.
연습으로 재미 있지만, 클래스를 인스턴스화하지 않고 표준 메시징 구문 및 컴파일러 지원을 사용하지 않는 좋은 이유는 생각할 수 없습니다. 실제로 여기에서 [(Foo *)nil doSomethingWithThis:@"BOO!"]
을 수행 할 수없는 유일한 이유는 objc_msgSend()
nil
에 대한 특수 사례 메시지이며 NO
이 반환되고 아무 일도 발생하지 않는다는 것입니다.
Upvoting 기술적으로 가장 정확하다는 것 외에도 이것은 매우 교육적이었습니다! –
,하지만 우리는하지 전화 오브젝티브 C에서 객체의 방법을, 우리는 객체에 메시지를 보내 . 메시지를 보내면 런타임에서 적절한 메소드를 찾아 호출합니다. 구별이 중요합니다.
전화 할 방법을 알려 주실 수 있습니까? –