【问题标题】:NSNumber numberWithInt crashing on numbers >= 13NSNumber numberWithInt 在数字 >= 13 上崩溃
【发布时间】:2011-08-23 18:22:59
【问题描述】:

我对 Objective-C 还是很陌生。我已经阅读了a similar question,但我不知道如何用这些信息解决我的问题。

基本上,我正在这样做:

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 文件完全空白)。如果这很重要,我正在 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 $@ $^ $(LINK_FLAGS)

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

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

【问题讨论】:

  • 您在该部分代码中没有做错任何事情。您需要发布更多内容。
  • 我在 Xcode 4.1 中尝试过,效果很好。我认为这是一个 gcc/Cygwin 错误。
  • 发布您的整个代码,如果大小合适的话。发布最小的、完整的示例来演示该问题。发布您如何编译代码(命令行、Makefile 等)。
  • @Jason:启用NSZombies 以查看是否收到错误消息。
  • @Adam - 我添加了一个完整的代码示例来演示这个问题,以及我的 Makefile。

标签: objective-c debugging nsnumber


【解决方案1】:

尝试用一行包围您的代码(您已放置在 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];

【讨论】:

【解决方案2】:

尝试以下方法:

  1. 在您 alloced 时发布 array1array2

    [array1 释放]; [array2 发布];

  2. 创建并释放一个自动释放池:

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

    ...

    [池释放];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多