NSMutableArray AddObject не добавляет объекты, и объект выделяется

#objective-c #cocoa-touch #ios #nsmutablearray

#objective-c #cocoa-touch #iOS #nsmutablearray

Вопрос:

Я пытаюсь использовать addObject: на NSMutableArray с созданным мной классом, который называется Position . Согласно журналам, Position экземпляра, который я добавляю в массив, нет nil — я могу вывести его свойства в журнал. Однако массив, похоже, никогда на самом деле не принимает Position .

 @implementation Position

@synthesize tradeDirection, instrument, quantity, fill, profit, positive, index;

-(id)initWithArray:(NSArray*)data
{
    self = [super init];
    if (self)
    {
        self.tradeDirection = [data objectAtIndex:0];
        self.instrument     = [data objectAtIndex:1];
        self.quantity       = [data objectAtIndex:2];
        self.fill           = (NSNumber*)[data objectAtIndex:3];
        self.profit         = [data objectAtIndex:4];
        self.positive       = [@"True" isEqualToString:[data objectAtIndex:5]];
        self.index          = (NSNumber*)[data objectAtIndex:6];
    }
    return self;
}

 (Position*)createPositionWithString:(NSString*)data
{
    return [[[self alloc] initWithArray:[data componentsSeparatedByString:@"#"]] autorelease];
}

@end
  

loadPositions: метод данных

 -(void)loadPositions:(NSString*)data
{
    TT_RELEASE_SAFELY(_positions);
    NSArray* dataArray = [data componentsSeparatedByString:@";"];
    for (int i = 2; i <= [dataArray count] - 2; i  )
    {
        //TODO: Discover why this does not add a position.
        Position* newPos = [Position createPositionWithString:[dataArray objectAtIndex:i]];
        [_positions addObject:newPos]; //position never actually gets added
        NSLog(@"Position direction: %@", newPos.tradeDirection); //logs what I expect, i.e. newPos is not nil
    }
}
  

После вызова loadPositions:data , _positions все еще nil . Довольно просто; у меня такое чувство, что это как-то связано с управлением памятью, но на данный момент мне просто нужна вторая пара глаз. Чего я не понимаю?

Комментарии:

1. Где вы создаете массив _positions?

2. Почти наверняка вы неправильно создаете / сохраняете массив _positions. Необходимо просмотреть больше кода, окружающего этот бит, поскольку все остальное, что вы опубликовали, выглядит нормально.

Ответ №1:

Макрос TT_RELEASE_SAFELY отправляет сообщение об освобождении своему аргументу, прежде чем присвоить ему значение nil (IIRC). Почему вас удивляет, что _positions равно нулю?

Хотя вам может потребоваться освободить _postitions по какой-либо причине, вы должны выделить и инициализировать новый объект и назначить его ссылку на _positions, прежде чем сможете добавлять в него элементы.

редактировать: как указал Люк в своем комментарии, TT_RELEASE_SAFELY из библиотеки three20.

 #define TT_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }
  

Комментарии:

1. Это. Могу ли я также добавить, что при использовании нестандартного библиотечного кода (такого как TT_RELEASE_SAFELY, это из библиотеки Three20?) это помогает объяснить, что он делает. Не все используют эти библиотеки.

2. Ах да, классическая парадигма современного программирования — присвоение объекту значения nil, в результате чего объект становится нулевым.

3. Мой комментарий был направлен на самом деле на OP, но спасибо за разъяснение.