OpenFlow вылетает при попытке сброса / воссоздания приложения
Я отчаянно пытаюсь изменить изображения на экземпляре OpenFlow без удачи. Я как бы сдаюсь, поэтому сейчас пытаюсь удалить экземпляр и создать новый. Но я не могу избежать сбоя приложения.
Код для его создания:
AFOpenFlowView *of = [[AFOpenFlowView alloc] initWithFrame:CGRectMake(0, 100, 320, 380)];
[of setCenter:CGPointMake(160, 240)];
[of setBackgroundColor:[UIColor blackColor]];
[of setDataSource:self];
[of setViewDelegate:self];
[self setPeopleFlow:of];
[self.view addSubview:peopleFlow];
[of release];
Затем одним нажатием кнопки я делаю:
[peopleFlow removeFromSuperview];
[peopleFlow release];
Позже я вызываю ту же функцию с первым блоком кода, чтобы создать его снова, и это происходит, когда приложение завершает работу без ошибок журнала.
Любые идеи о том, как очистить объект OpenFlow, чтобы снова заполнить его без необходимости удалять / воссоздавать? Или как создать / воссоздать надежно?
1 ответ
Когда вы создаете экземпляр peopleFlow, он имеет счет сохранения 1.
Затем, когда вы добавляете его в качестве подпредставления, суперпредставление сохраняет его, поэтому его счетчик равен 2.
Затем вы отпускаете его после добавления его в суперпредставление, так что его счет удержания снова равен 1.
Затем Вы удаляете его из суперпредставления, и супервизор освобождает его, поэтому его счетчик сохранения равен 0, и объект освобождается.
Затем вы пытаетесь выпустить его снова, и он падает, потому что вы отправляете release
на освобожденный объект.
Короче говоря, в этом случае вам не нужно выпускать его после удаления из суперпредставления.
Кроме того, хорошей практикой является присвоение nil указателю, если вы отпустите его, и вам больше не важно, на что он указывает. Это связано с тем, что после того, как вы освободили и освободили объект, переменная-указатель все еще указывает на память, которую занимал объект. Присвоение nil указателю предотвратит любые неприятности, если вы попытаетесь отправить сообщение тому, на что указывает свисающий указатель.