Объект Objective-C со статической типизацией, кажется, думает, что это вместо NSCFArray - PullRequest
0 голосов
/ 26 августа 2010

Я пытаюсь подобрать 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

Ответы [ 2 ]

3 голосов
/ 26 августа 2010

Во-первых, поместите пул автоматического выпуска в main (), чтобы закрыть все проблемы с автоматическим выпуском.

Далее обратите внимание на предупреждения компилятора. Если есть предупреждение, в вашем коде есть ошибка или потенциальная ошибка. И обязательно должно быть предупреждение о том, что именно не так.

А именно, ваш -init метод неверен:

- (id)init {
    children = [[NSMutableArray alloc] init];
} // end method init

Вы не заканчиваете это return self;. Или, более конкретно, вы не:

- init {
    self = [super init];
    if (self) {
        children = [[NSMutableArray alloc] init];
    }
    return self;
}

Кроме того, вы должны стараться следовать тем же шаблонам, что и фреймворки и API Apple. А именно, не ставьте эти методы перед префиксом get. Наконец, убедитесь, что вы также добавили метод dealloc.

0 голосов
/ 26 августа 2010

Единственная вещь, которая выглядит странно здесь, в верхней части моей головы, это ": NSObject" в теге @implementation.Я никогда не видел наследование, объявленное в @implementation, просто @interface.Не знаю, почему это вызвало бы ошибку, которую вы видите.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...