2010-08-26 43 views
0

我試圖拿起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 

回答

3

首先,在你的main()中放置一個autorelease池來關閉所有的autorelease問題。

接下來,注意編譯器警告。如果出現警告,則代碼中存在錯誤或潛在錯誤。而且肯定應該有一個警告文件,確切地說是什麼錯誤。

也就是說,你-init方法是錯誤的:

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

你不return self;結束。或者,更具體地說,您不需要:

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

另外,您應該嘗試遵循與Apple框架和API相同的模式。也就是說,不要在get的前面加上前綴。最後,請確保您也添加了dealloc方法。

+0

對,迴歸自己有點重要,不是。這將做到這一點。因爲它返回的是children數組而不是控制器對象。 – 2010-08-26 16:05:15

0

,看起來唯一我的頭頂怪怪的是@implementation標籤處的「: NSObject」。我從來沒有見過在@implementation中聲明的繼承,只是@interface。不知道爲什麼這會導致你所看到的錯誤。

+0

那麼......這是有效的,儘管完全陳舊,語法。 – bbum 2010-08-26 15:51:40

相關問題