2010-07-01 140 views
0

我檢查了Google,但我還沒有找到任何有用的信息。 我正在Objective-C中編寫一個堆棧類,堆棧基於NSMutableArray,但是,我無法向它添加任何對象,也沒有在控制檯中拋出任何錯誤,並且沒有編譯警告/錯誤。這是我的堆棧對象的代碼。無法添加對象到NSMutableArray

#import "Stack.h" 

@implementation Stack 
@synthesize stack; 

- (id)init { 
    self.stack = [[NSMutableArray alloc] init]; 
    return self; 
} 

- (void)push:(id)object { [self.stack addObject:object]; } 

- (int)size { return [self.stack count]; } 

- (id)pop { 
    id obj = [[[self.stack lastObject] retain] autorelease]; 
    [self.stack removeLastObject]; 
    return obj; 
} 

- (id)peek { return [self.stack lastObject]; } 

@end 

頁眉:

#import <Cocoa/Cocoa.h> 

@interface Stack : NSObject { 
    NSMutableArray *stack; 
} 

- (void)push:(id)object; 
- (int)size; 
- (id)pop; 
- (id)peek; 

@property (nonatomic, retain) NSMutableArray *stack; 

@end 

對於代碼的其餘部分,如果我叫[test_stack大小],它返回零,不管多少次,我推的對象,如果我叫流行或偷看,它只是返回(空)。

#import "TRIAL_Stack_Ctrl.h" 


@implementation TRIAL_Stack_Ctrl 
@synthesize test; 

- (IBAction)push:(id)sender { 
    [test_stack push:[input stringValue]]; 
} 
- (IBAction)pop:(id)sender { 
    [label setStringValue:[NSString stringWithFormat:@"%@", [test_stack pop]]]; 
} 
- (IBAction)peek:(id)sender { 
    [label setStringValue:[NSString stringWithFormat:@"%@", [test_stack peek]]]; 
} 
- (IBAction)size:(id)sender { 
    [label setStringValue:[NSString stringWithFormat:@"%d", [test_stack size]]]; 
} 

@end 

這使我相信它不推動對象,有什麼我做錯了嗎?

+0

您的'test_stack'變量是'nil',這是您所看到的症狀(從消息返回的零和nils)。有關理由,請參閱下面的答案。 – 2010-07-01 22:28:51

回答

2

變化:

- (id)init { 
    self.stack = [[NSMutableArray alloc] init]; 
    return self; 
} 

到:

- (id)init { 
    self = [super init]; 
    if (self) { 
     stack = [[NSMutableArray alloc] init]; 
    } 
    return self; 
} 
+0

雖然這是做事的標準方式,但[NSObject init]不會執行任何操作,而是返回自我,如果self是nil init,將永遠不會調用。基本上他在做什麼是好的,因爲他直接從NSObject繼承。此外,他不應該在init方法中使用訪問器。 – 2010-07-01 18:50:41

+0

@Jared P:更改了存取器的使用。 我不確定在哪裏'self'被設置爲創建的實例。我的懷疑是'self'從'-init'方法返回時是'nil',因爲他沒有在'super'上調用這個方法。這聽起來像是他正在調用'nil'而不是他的'Stack'類的一個實例。 – 2010-07-01 19:40:16

+0

在這個意義上,self並不是'set set',它是該方法的一個隱藏參數,實際上它只是一個常規的C函數,在聲明之前有2個隱含的額外參數(id self,SEL _cmd)。基本上,在調用方法之前設置self。 objc運行時會檢查消息的目標(自願參數)是否爲零,如果是,它就不會傳遞消息。因此,自我不能無法進入任何客觀的方法。 – 2010-07-02 01:05:32

1

除了泄漏的NSMutableArray,並不必要地使用self.stack,它看起來OK。所以看起來你的問題可能是在TRIAL_Stack_Ctrl類中,你不會顯示代碼。

如果你覺得你瘋了,斷言可以幫助你瞭解正在發生的事情的底部。

- (void)push:(id)object { 
    NSParameterAssert(object); 
    [stack addObject:object]; 
    NSAssert([stack count], @"array is empty"); 
} 

它們在發佈代碼中沒有任何東西。

0

我們可以看到.h的實現嗎?我看到你正在綜合所謂的'測試',但所有的操作都是在'test_stack'上完成的。命名問題?如果是這樣,它應該也可能是'self.test_stack'。

1

如果這真的是你的TRIAL_Stack_Ctrl類的完整實現,那麼你不會在任何地方分配測試棧實例變量,所以它是零。

1

這使我相信它不是推動對象,我有什麼做錯了嗎?

不正確的假設。如果可變數組中沒有對象,removeLastObject將拋出NSRangeException。如果你沒有看到範圍異常,當你試圖彈出一個空棧時,棧本身必須爲零。