Преобразованное в ARC приложение вылетает при любом методе iPhone

#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]];