#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, но спасибо за разъяснение.