Вызов методов NSMutableSet в другой функции вызывает EXC_BAD_ACCESS - PullRequest
1 голос
/ 15 июня 2011

Я застрял на таком коде:

static NSMutableSet* test_set;

-(void)foo1
{
  test_set=[NSMutableSet setWithObject:[NSNumber numberWithInt:1]];
  NSLog(@"count:%d",[test_set count]);
}


-(void)foo2
{
  NSLog(@"pointer:%p",test_set);
  NSLog(@"count:%d",[test_set count]); // here I get EXC_BAD_ACCESS
}

Я вызываю foo2 только после foo1.Моя отладка выглядит так:

count:1
pointer:0x262790
Program received signal:  “EXC_BAD_ACCESS”.

Что не так?___ Интересная заметка: происходит сбой, только когда foo2 звонит по расписанию. Извините, я пропустил детали.Оба работают отлично.Спасибо всем

Ответы [ 2 ]

0 голосов
/ 15 июня 2011

Вы не сохранили test_set.Набор, возвращенный setWithObject:, будет автоматически освобожден.Если вы добавите

[test_set retain];

после возврата набора из setWithObject: в foo1() и добавите

[test_set release];

в конец foo2(), это должно работать.

Вероятно, вам следует прочитать Руководство по программированию управления памятью Cocoa .

0 голосов
/ 15 июня 2011

Вы не вступаете во владение объектом, назначаемым test_set, что означает, что он может быть освобожден до отправки -foo2. В общем, если вам нужен объект, чтобы выжить после выполнения метода, вы должны стать его владельцем - например, через +alloc или -retain:

-(void)foo1
{
  test_set=[[NSMutableSet alloc] initWithObjects:[NSNumber numberWithInt:1], nil];
  NSLog(@"count:%d",[test_set count]);
}

или

-(void)foo1
{
  test_set=[[NSMutableSet setWithObject:[NSNumber numberWithInt:1]] retain];
  NSLog(@"count:%d",[test_set count]);
}

Правила получения и отказа от владения объектами обсуждаются в Руководство по программированию управления памятью .

...