Решением является использование свойства Stderr
объекта Command. Это можно сделать следующим образом:
cmd := exec.Command("find", "/", "-maxdepth", "1", "-exec", "wc", "-c", "{}", "\\")
var out bytes.Buffer
var stderr bytes.Buffer
cmd.Stdout = &out
cmd.Stderr = &stderr
err := cmd.Run()
if err != nil {
fmt.Println(fmt.Sprint(err) + ": " + stderr.String())
return
}
fmt.Println("Result: " + out.String())
Выполнение приведенного выше кода позволит понять, в чем заключается проблема:
состояние выхода 1: найти: -exec: нет завершения ";" или "+"
Редактировать:
В приведенном выше коде мы ожидаем, что в случае ошибки сообщения будут напечатаны в stderr и команду вернет ненулевой код ошибки. Это более или менее стандартно.
Однако, как упомянуто ниже @snorberhuis, некоторые команды выводят ошибки на стандартный вывод. Другие команды могут печатать в stderr, но возвращать код ошибки 0 (в этом случае err
будет nil
). И наличие сообщений в stderr не обязательно означает, что есть ошибка (инструменты ffmpeg делают это много).
Таким образом, в основном вам может понадобиться настроить приведенный выше код для соответствия ожидаемым командам.
Эта строка:
[window addSubview:nav.view];
НЕ добавляет представление на экран немедленно. Он отображается ОС в каком-то будущем цикле выполнения, возможно, в другом потоке. В фактической реализации мы не можем быть уверены.
Вот почему Apple определяет методы делегата, такие как viewDidAppear / viewWillAppear, в противном случае они нам не понадобились бы, поскольку мы точно знали бы, когда происходят эти события.
Более того, добавление подпредставления, как вы сказали, действительно сохраняет представление. Он НЕ , но сохраняет контроллер представления или контроллер навигации. Поскольку контроллер навигации БУДЕТ сохранять любые добавленные контроллеры представления, нам не нужно поддерживать их с помощью ivar.
Но ваша ссылка на контроллер навигации должна сохраняться за пределами области действия метода. или, в зависимости от вашего кода, он может быть освобожден или ссылка на него потеряна.
Таким образом, вы должны сохранить ссылку на контроллер навигации с помощью ivar и установить ее следующим образом:
self.navigationController = nav;
Таким образом, даже если nav.view содержит указатель на testViewController.view, приложение не имеет ссылки на контроллер навигации и, соответственно, на представление. В результате появляется пустой экран.
Чтобы сделать это более очевидным, что это не проблема сохранения / освобождения, вы на самом деле используете следующий метод:
self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];
Вам необходимо выполнить автоматическое освобождение, чтобы сбалансировать ваше удержание / освобождение на :
self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];
Итак, это означает, что ваше представление никогда, никогда не освобождалось при запуске этого кода. Что еще раз убеждает нас в том, что ваша проблема действительно утеряна.
self.navigationController = nav;
Таким образом, хотя nav.view содержит указатель на testViewController.view, приложение не имеет ссылки на контроллер навигации и, соответственно, на представление. В результате появляется пустой экран.
Чтобы сделать это более очевидным, что это не проблема сохранения / освобождения, вы на самом деле используете следующий метод:
self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];
Вам необходимо выполнить автоматическое освобождение, чтобы сбалансировать ваше удержание / освобождение на :
self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];
Итак, это означает, что ваше представление никогда, никогда не освобождалось при запуске этого кода. Что еще раз убеждает нас в том, что ваша проблема действительно утеряна.
self.navigationController = nav;
Таким образом, хотя nav.view содержит указатель на testViewController.view, приложение не имеет ссылки на контроллер навигации и, соответственно, на представление. В результате появляется пустой экран.
Чтобы сделать это более очевидным, что это не проблема сохранения / освобождения, вы на самом деле используете следующий метод:
self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];
Вам необходимо выполнить автоматическое освобождение, чтобы сбалансировать ваше удержание / освобождение на :
self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];
Итак, это означает, что ваше представление никогда, никогда не освобождалось при запуске этого кода. Что еще раз убеждает нас в том, что ваша проблема действительно утеряна.
на самом деле происходит утечка в следующем методе:self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];
Вам необходимо выполнить автоматическое освобождение, чтобы сбалансировать ваше сохранение / освобождение:
self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];
Таким образом, это означает, что ваше представление никогда, никогда не было освобождено, когда вы запускали этот код. Что еще раз убеждает нас в том, что ваша проблема действительно утеряна.
на самом деле происходит утечка в следующем методе:self.testViewController = [[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]];
Вам необходимо выполнить автоматическое освобождение, чтобы сбалансировать ваше сохранение / освобождение:
self.testViewController = [[[TestViewController alloc] initWithNibName:@"TestView" bundle: [NSBundle mainBundle]] autorelease];
Таким образом, это означает, что ваше представление никогда, никогда не было освобождено, когда вы запускали этот код. Что еще раз убеждает нас в том, что ваша проблема действительно утеряна.
Проблема, вероятно, не в том, что представление не сохраняется, а в том, что контроллер не сохраняется.
Без этой строки:
self.navigationController = nav
Ничто не сохраняет контроллер навигации. Было бы странно, если бы вид пережил контроллер.
This doesn't look lika a retain/release question to me. You view won't show up if you comment out self.navigationController = nav;
because then in the next line, [window addSubview:self.navigationController.view]
your self.navigationController property won't be set. It's probably nil or it would crash but can't say for sure without more of the code.