Я пытаюсь подобрать Objective-C, но наткнулся на контрольно-пропускной пункт, экспериментируя с синтаксисом объекта. Когда я пытаюсь вызвать метод из класса, который я определил, я получаю это как вывод.
11:29:19 $ /Users/rsmith/Projects/Objective-C/Expedition/a.out; exit
Loading command-line wrapper...load successful!
2010-08-26 11:29:19.070 a.out[1619] *** _NSAutoreleaseNoPool(): Object 0x303ff0 of class NSCFString autoreleased with no pool in place - just leaking
2010-08-26 11:29:19.071 a.out[1619] *** -[NSCFArray getChild]: selector not recognized [self = 0x302d70]
2010-08-26 11:29:19.071 a.out[1619] *** _NSAutoreleaseNoPool(): Object 0x304bd0 of class NSCFString autoreleased with no pool in place - just leaking
2010-08-26 11:29:19.071 a.out[1619] *** _NSAutoreleaseNoPool(): Object 0x3050f0 of class NSCFString autoreleased with no pool in place - just leaking
2010-08-26 11:29:19.071 a.out[1619] *** _NSAutoreleaseNoPool(): Object 0x3050d0 of class NSException autoreleased with no pool in place - just leaking
2010-08-26 11:29:19.071 a.out[1619] *** Uncaught exception: <NSInvalidArgumentException> *** -[NSCFArray getChild]: selector not recognized [self = 0x302d70]
Trace/BPT trap
logout
[Process completed]
Помимо утечек памяти, он, похоже, не распознает мой метод, потому что думает, что объект является NSCFArray. Что я здесь не так делаю? Полный код обертки и определения классов:
wrapper.m
#import "AbstractController.h"
int main() {
fprintf(stdout, "Loading command-line wrapper...");
fprintf(stdout, "load successful!\n");
AbstractController * controller = [[AbstractController alloc] init];
[controller getChild];
return 0;
} // end function main
AbstractController.h
#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSString.h>
@interface AbstractController : NSObject
{
AbstractController * parent;
NSMutableArray * children;
}
// instance methods
- (id)init;
- (AbstractController *)getAncestor;
- (AbstractController *)getChild;
- (AbstractController *)getHeir;
- (AbstractController *)getParent;
@end // interface AbstractController
AbstractController.m
#import <Foundation/NSObject.h>
#import <Foundation/NSArray.h>
#import <Foundation/NSString.h>
#import "AbstractController.h"
@implementation AbstractController : NSObject
- (id)init {
children = [[NSMutableArray alloc] init];
} // end method init
- (AbstractController *)getParent {
return parent;
} // end method getParent
- (AbstractController *)getChild {
AbstractController * child = ([children count] > 0) ? [children objectAtIndex:0] : self;
return child;
} // end method getChild
- (AbstractController *)getAncestor {
AbstractController * ancestor;
ancestor = (parent) ? [parent getAncestor] : self;
return ancestor;
} // end method getAncestor
- (AbstractController *)getHeir {
AbstractController * child = [self getChild];
AbstractController * heir;
heir = (child) ? [child getHeir] : self;
return heir;
} // end method getHeir
@end // implementation AbstractController