#iphone #memory #automatic-ref-counting
#iPhone #память #автоматический подсчет ссылок
Вопрос:
Я преобразовал свое приложение в ARC и удалил все ошибки предварительной сборки. Он запускается, но завершается сбоем (EXC_BAD_ACCESS), как только я вызываю любой метод (все из которых привязаны к UIButtons). Я также заметил, что он спросит, разрешит ли пользователь приложению использовать местоположение пользователя, но предупреждение исчезнет до того, как пользователь сможет ответить «да» или «нет».
Я чувствую, что из-за этого мне не хватает какой-то очень простой настройки.
Вот первый вызванный метод, он не позволит пользователю фактически сказать, разрешат ли они службы определения местоположения. Предупреждение срабатывает, а затем исчезает. Помогает ли это кому-либо в диагностике?
-(void)startLocation
{
locationManager = [[CLLocationManager alloc] init];
locationManager.delegate = self;
locationManager.desiredAccuracy = kCLLocationAccuracyBest;
[locationManager startUpdatingLocation];
}
Кроме того, вот мой метод didFinishLaunchingWithOptions
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
// Override point for customization after application launch.
UINavigationController *nav = [[UINavigationController alloc] init];
StartPageViewController *start = [[StartPageViewController alloc]init];
NSManagedObjectContext *context = [self managedObjectContext];
if (!context)
{
// Handle the error.
}
start.managedObjectContext = context;
nav.viewControllers = [NSArray arrayWithObjects:start, nil];
[_window addSubview:[nav view]];
[self.window makeKeyAndVisible];
return YES;
}
Комментарии:
1. Вы преобразовали свой код в ARC (Редактировать-> Рефакторинг-> Преобразовать в objectice C ARC)?
2. Подключены ли UIButtons как выходы? Если это так, вам нужен формат в вашем заголовке
@property (nonatomic, strong) IBOutlet UIButton *myButton;
, и все должно быть в порядке3. Все еще получаю EXC_BAD_ACCESS, и я все еще не могу сообщить приложению, что оно может использовать службы определения местоположения. Он исчезает, прежде чем я смогу ответить.
4. Вы установили точку останова в application:didFinishLaunchingWithOptions и перешли оттуда? Это, по крайней мере, даст вам подсказку о том, где происходит сбой, и вы сможете изучить стек вызовов.
5. Он достигает точки останова при didFinishLaunching нормально. Первый метод, вызываемый при первом просмотре, заключается в запуске служб определения местоположения. Вот код для этого
Ответ №1:
Попробуйте сохранить свой навигационный контроллер, сделав его надежным свойством в вашем делегате.
На данный момент я не вижу никакого кода, который заставил бы ARC не выпускаться nav
в конце метода. Это освободило бы start
, который освободил бы context
.
Комментарии:
1. Это просто дает мне белый экран
2. @Terry похоже, что _window ivar сохранит, по крайней мере, вид
nav
, но, возможно, не навигацию3. Все, что мне нужно было изменить (до сих пор), было: self.window.RootViewController = nav; вместо: [_window addSubview:[вид навигации]];
4. ‘self.window.RootViewController = nav’ также сохранится
nav
.5. @jbrennan Я не думаю, что представление контроллера что-либо знает о контроллере, поэтому там не было бы сохранения.
Ответ №2:
Все, что мне нужно было изменить (пока), было:
self.window.rootViewController = nav;
вместо:
[_window addSubview:[nav view]];