使用for循环迭代后更改已分配的NSObject的值

时间:2014-10-26 17:17:00

标签: objective-c foundation

如果有人想知道这是什么,我正在为BNR ObjC指南做挑战。我创建了一个名为WCDStockHolding的自定义类,它具有属性“name”,“currentPrice”,“purchasePrice”和“numberOfShares”。我要求用户告诉程序他们有多少馆藏然后多次迭代以将馆藏分配为NSMutableArray中的班级实例。问题是,我的阵列中所有WCDStockHoldings的名称都改为最后添加的名称。经过多次调试后,我认为这是由于我的setName实例方法。我做错了什么?我似乎无法弄清楚这一点。数组中对象的所有其他方面都很好。

setName实现:

- (void)setName: (char*)n
{
    _name = n;
}

减少主要功能:

    NSMutableArray* stockArray = [[NSMutableArray alloc] init];

    char Stocks[100];
    printf("Enter Number of Stocks: ");
    scanf("%s", Stocks);
    int stocks = strtod(Stocks, NULL);

    for (int i=0; i<stocks; i++)
    {
        WCDStockHolding* holding = [[WCDStockHolding alloc] init];

        printf("[%d] Enter Stock [Name], [Purchase Price], [Current Price], and [Number of Shares]", i);
        printf("\nSeparated by commas (w/ no spaces) like above ");
        printf("\n>> ");

        char string[100];
        /* Declared name,PP,CP,and NS */


        char* items[100];

        scanf("%s", string);

        /* used strtok to split string into separate elements in array of strings 'item */

        name = items[0];  //name
        PP = strtof(items[1], NULL);  //purchasePrice
        CP = strtof(items[2], NULL);  //currentPrice
        NS = strtod(items[3], NULL);  //numberOfStocks

        [holding setName:name];
        [holding setPurchsePrice:PP];
        [holding setCurrentPrice:CP];
        [holding setNumberOfShares:NS];

        [stockArray insertObject:holding atIndex:i];
    }

1 个答案:

答案 0 :(得分:0)

好的,我明白了。而不是在WCDStockHolding中使用_name作为char *我将其更改为NSString以及main中的所有方法。我还使用了一个单独的for循环来分配馆藏,并在&#39;设置中引用它们。 for循环作为数组的调用,它们已被添加到。

使用分配循环:

for (int i=0; i<stocks; i++)
{
    WCDStockHolding* holding = [[WCDStockHolding alloc] init];
    [stockArray addObject:holding];
}

将_name作为NSString处理并通过数组引用设置ivars:

    for (int i=0; i<stocks; i++)
    {
        // request input form user

        char string[100];
        NSString* name = [[NSString alloc] init];
        // declare other variables

        char* items[100];

        scanf("%s", string);

        // use strtok to split string into items

        name = [NSString stringWithUTF8String:items[0]];
        // ...set others seen in initial question

        [[stockArray objectAtIndex:i] setName:name];
        // same as question in besides reference via array like above line
    }