2009-09-03 11 views

답변

1

아마도 평범한 C 함수를 원할 수도 있습니다. 클래스 메소드를 원하지 않고 인스턴스 메소드가 필요하지 않은 경우 유일한 옵션 인 것 같습니다. Objective-C에서 C 함수를 사용하는 것을 두려워하지 마십시오. 모든 기술에는 그 자리가 있습니다.

4

방법이 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]; 
5

존재하지 않는 객체의 메소드를 호출 할 수 없습니다 예를 들어 NSObject의은 (많은 중)이 두 루틴을 제공 . 그러나 클래스의 메소드를 호출 할 수 있습니다. 클래스의 인스턴스화 된 객체가없는 경우에도 마찬가지입니다. (alloc이 @fbrereton의 대답 인 클래스 메소드이다.

클래스 메서드는 - 대신 +로 정의되고 정의되며 인스턴스가 아닌 클래스에서 호출되며 클래스의 자체 또는 인스턴스 변수에 액세스 할 수 없습니다 (이유가 분명해야 함).

+0

이 언어로이 "고정 방법"을 사용 하시겠습니까? –

+0

@ Objective-C에서 @ d03boy 우리는 이러한 "클래스"메서드를 호출하지만 다른 언어에서 사용되는 정적 메서드와 기능적으로 동일합니다. –

+0

개체 -c 클래스는 인스턴스와 마찬가지로 실제 개체이기 때문에이 메서드는 정적 메서드 이상입니다. 예를 들어 - [NSArray 배열] 메서드는 수신기의 인스턴스를 반환한다는 점에서 동적입니다.[NSMutableArray array]는 배열이 변경 가능하지만 NSMutableArray는 해당 메서드를 재정의 할 필요가 없습니다. 다음과 같은 메소드를 구현하면됩니다 : "return [[[self alloc] init] autorelease]". 그것은 '자기'는 NSMutableArray를, 다른 NSArray는 다른 NSMutableArray이기 때문에 효과가 있습니다. 따라서 objective-c에서 다형성 클래스 메소드를 가질 수 있습니다. –

1

인스턴스 메소드가 실제로는 클래스 메소드 (인스턴스 변수에 액세스하지 않음) 인 경우 인스턴스 메소드를 실제로 호출 할 수 있습니다. 다음은 예입니다 :

당신은 작업을하는 것이 메모리를 할당하여 인스턴스 메소드는 인스턴스 변수에 액세스하는 경우에도 작업을 얻을 수
/* 
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()) 그 메모리로의 포인터를 전달 첫 번째 idnil 대신 구현에 인수.

연습으로 재미 있지만, 클래스를 인스턴스화하지 않고 표준 메시징 구문 및 컴파일러 지원을 사용하지 않는 좋은 이유는 생각할 수 없습니다. 실제로 여기에서 [(Foo *)nil doSomethingWithThis:@"BOO!"]을 수행 할 수없는 유일한 이유는 objc_msgSend()nil에 대한 특수 사례 메시지이며 NO이 반환되고 아무 일도 발생하지 않는다는 것입니다.

+0

Upvoting 기술적으로 가장 정확하다는 것 외에도 이것은 매우 교육적이었습니다! –

2
니트 - 선택 크리스 '용어에 대한 죄송합니다

,하지만 우리는하지 전화 오브젝티브 C에서 객체의 방법을, 우리는 객체에 메시지를 보내 . 메시지를 보내면 런타임에서 적절한 메소드를 찾아 호출합니다. 구별이 중요합니다.

관련 문제