Проблема в вашем коде - управление памятью.
Когда вы создаете rightItems[]
, массив из AuthorizationItem
элементов, он создается в стеке, поскольку rightItems[]
является автоматической (локальной) переменной. Это означает, что память, используемая массивом, освобождается в конце метода. Поскольку вы присваиваете rightItems[]
для authRights.items
, authRights.items
указывает на поддельный адрес памяти после завершения -init
. Любая дальнейшая ссылка на authRights.items
имеет неопределенное поведение и может привести к ошибке в вашей программе.
Что вам нужно сделать, это создать массив в куче, чтобы он не был освобожден после завершения -init
. Вы можете сделать это через malloc()
. Например:
const size_t numberOfRightItems = 1;
AuthorizationItem *rightItems = malloc(sizeof(AuthorizationItem)
* numberOfRightItems);
rightItems[0] = (AuthorizationItem){"com.myname.myapp.adminRights", 0, NULL, 0};
authRights.items = rightItems;
Теоретически вы несете ответственность за выпуск authRights.items, когда он больше не нужен, поскольку вы выделили ему память в куче. Следовательно, в вашем -dealloc
методе:
- (void)dealloc {
free(authRights.items);
super[dealloc];
}
Я сказал в теории , потому что вы сохраняете права авторизации в вашем контроллере приложений. Поскольку контроллер приложения живет на протяжении всего жизненного цикла приложения, технически оно не получит -release
или -dealloc
. Однако это хорошая практика и потенциально полезно, если вы реорганизуете свое приложение, и этот код оказывается в классе, чьи объекты не обязательно являются живыми, пока приложение не завершится.
Еще одно примечание: вы должны присвоить возвращаемое значение от [super init]
до self
в вашем -init
методе. Это также хорошая практика, поскольку вполне возможно, что [super init]
возвращает объект, отличный от текущего self
.