2011-08-23 25 views
3

我很新的Objective-C。我已閱讀a similar question,但我無法弄清楚如何解決我的問題與該信息。NSNumber numberWithInt崩潰的數字> = 13

基本上,我這樣做:

NSMutableArray* array1 = [[NSMutableArray alloc] initWithCapacity: 1]; 
NSNumber *n1 = [NSNumber numberWithInt: 12]; 
[array1 addObject: n1]; 
NSMutableArray* array2 = [[NSMutableArray alloc] initWithCapacity: 1]; 
NSNumber *n2 = [NSNumber numberWithInt: 13]; 
[array2 addObject: n2]; 

添加的NSNumber 12到陣列工作完全正常,但添加13(或任何更高)不;該程序在運行時崩潰(沒有錯誤消息,並且生成的堆棧轉儲文件完全空白)。如果有問題,我正在用Cygwin編譯gcc。 據我所知,這可能與保留計數有關,就像我在上面提到的問題,但我不知道如何解決它。即使我註釋掉最後一行,它也會崩潰......所以它會在numberWithInt調用中崩潰,這意味着如果爲n2添加保留語句,它將不會有機會被調用。

編輯:既然我被要求更多的代碼,這裏是我爲了測試這個問題方面取得的文件:

#import <stdio.h> 
#import <Foundation/NSArray.h> 
#import <Foundation/NSValue.h> 

int main(int argc, const char *argv[]) 
{ 
    printf("1.\n"); 
    NSMutableArray* array1 = [[NSMutableArray alloc] initWithCapacity: 1]; 
    NSNumber *n1 = [NSNumber numberWithInt: 12]; 
    [array1 addObject: n1]; 
    NSMutableArray* array2 = [[NSMutableArray alloc] initWithCapacity: 1]; 
    NSNumber *n2 = [NSNumber numberWithInt: 13]; 
    [array2 addObject: n2]; 
    printf("2.\n"); 

    return 0; 
} 

這版畫「1」。然後崩潰,如上所述。這是我的makefile:

CYGWIN_GNUSTEP_PATH=/cygdrive/c/GNUstep 
CXX = gcc 
MAIN = DummyGame 
SOURCES = DummyGame.m 
OBJECTS = $(SOURCES:%.m=%.o) 
COMP_FLAGS = -std=c99 -I $(CYGWIN_GNUSTEP_PATH)/GNUstep/System/Library/Headers -L $(CYGWIN_GNUSTEP_PATH)/GNUstep/System/Library/Libraries -fconstant-string-class=NSConstantString 
LINK_FLAGS = $(COMP_FLAGS) -lobjc -lgnustep-base 

all: $(MAIN) 

$(MAIN): $(OBJECTS) 
    $(CXX) -o [email protected] $^ $(LINK_FLAGS) 

%.o: %.m $(HEADERS) 
    $(CXX) -c $< $(COMP_FLAGS) 

clean: 
$(RM) $(MAIN) $(OBJECTS) 
+6

你不會在那部分代碼中做任何錯誤。你需要發佈更多。 – Yuji

+0

我在Xcode 4.1中試過了,它工作正常。我認爲它是一個gcc/Cygwin錯誤。 –

+3

發佈您的*整個*代碼,如果它是一個合理的大小。發佈最小的**完整**示例來證明問題。發佈你如何編譯代碼(命令行,Makefile等)。 –

回答

5

嘗試圍繞你的代碼(您放置在主)用一條線來創建和然後瀝乾一個自動釋放池:

NSAutoReleasePool *pool = [[NSAutoReleasePool alloc] init]; 
NSMutableArray* array1 = [[NSMutableArray alloc] initWithCapacity: 1]; 
NSNumber *n1 = [NSNumber numberWithInt: 12]; 
[array1 addObject: n1]; 
NSMutableArray* array2 = [[NSMutableArray alloc] initWithCapacity: 1]; 
NSNumber *n2 = [NSNumber numberWithInt: 13]; 
[array2 addObject: n2]; 
[pool drain]; 
+0

啊,那照顧它。謝謝! –

+0

[[NSNumber numberWithInt:]'成功實現小整數的原因可能與GNUstep(和Apple's)[小NSNumbers的標記指針表示]有關(http://objectivistc.tumblr.com/post/7872364181/tagged-pointers -and-快徑處理,cfnumber-整數型)。 – Quuxplusone

0

嘗試以下操作:

  1. 發佈array1array2alloc編這些:

    [array1 release]; [array2 release];

  2. 創建和釋放autoreleasepool:

    NSAutoreleasePool *池= [[NSAutoreleasePool的alloc] INIT];

    ...

    [pool release];