NSNumber numberWithInt сбой на числах> = 13 - PullRequest
3 голосов
/ 23 августа 2011

Я довольно новичок в Objective-C.Я прочитал аналогичный вопрос , но я не могу понять, как решить мою проблему с этой информацией.

В основном я делаю это:

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 (или чего-то более высокого) не дает;программа аварийно завершает работу во время выполнения (нет сообщений об ошибках, а созданный файл stackdump полностью пуст).Я собираю gcc в Cygwin, если это имеет значение.Я понимаю, что это, вероятно, связано с сохранением количества, как в вопросе, который я упомянул выше, но я не знаю, как это исправить.Даже если я закомментирую последнюю строку, она падает ... поэтому она падает прямо при вызове numberWithInt, а это означает, что если я добавлю инструкцию retain для n2, у нее все равно не будет возможности вызвать вызов.

edit: Так как меня попросили больше кода, вот файл, который я сделал для проверки этой проблемы:

#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».а затем вылетает, как указано выше.Вот мой make-файл:

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 $@ $^ $(LINK_FLAGS)

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

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

Ответы [ 2 ]

5 голосов
/ 23 августа 2011

Попробуйте окружить ваш код (который вы поместили в main) строкой для создания, а затем истощить пул автоматического выпуска:

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 голосов
/ 24 августа 2011

Попробуйте следующее:

  1. Отпустите array1 и array2, как вы alloc отредактировали эти:

    [array1 release];[выпуск array2];

  2. Создание и выпуск автозапуска:

    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    ...

    [выпуск пула];

...