addSubview UIVIEW действительно сохраняет представление?

Решением является использование свойства 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 делают это много).

Таким образом, в основном вам может понадобиться настроить приведенный выше код для соответствия ожидаемым командам.

12
задан Vladimir 2 March 2010 в 15:48
поделиться

3 ответа

Эта строка:

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

Таким образом, это означает, что ваше представление никогда, никогда не было освобождено, когда вы запускали этот код. Что еще раз убеждает нас в том, что ваша проблема действительно утеряна.

24
ответ дан 2 December 2019 в 05:55
поделиться

Проблема, вероятно, не в том, что представление не сохраняется, а в том, что контроллер не сохраняется.

Без этой строки:

self.navigationController = nav

Ничто не сохраняет контроллер навигации. Было бы странно, если бы вид пережил контроллер.

2
ответ дан 2 December 2019 в 05:55
поделиться

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.

0
ответ дан 2 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: