我試圖拿起Objective-C,但遇到了試驗對象語法的障礙。當我嘗試從我定義的類中調用某個方法時,我將其作爲輸出獲取。靜態類型的Objective-C對象似乎認爲這是一個NSCFArray而不是
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
對,迴歸自己有點重要,不是。這將做到這一點。因爲它返回的是children數組而不是控制器對象。 – 2010-08-26 16:05:15