несколько вопросов об obj-c (делегат, viewController, симулятор) - PullRequest
1 голос
/ 29 июня 2011

У меня было несколько вопросов о цели-c, не могли бы вы помочь мне понять это?Вот они:

  1. почему мы иногда используем:
    self.myView.delegate = self;?

То же самое происходит с Ipad и Splitview: почему мы используем делегат явно следующим образом:

uisplitviewController * svc = ...
svc.delegate = pvc.otherViewController;

Пока я понимаю "appDelegate", но как насчет этого метода делегата?

2.Я видел несколько раз использование другого«viewController», как показано ниже, вместо «выделения» непосредственно «mainViewControler», почему мы используем это промежуточное звено?

MainViewController * viewController = [[MainViewController alloc] initWithNibName: @ "MainView" bundle:nil];
self.mainViewController = viewController;
[viewController release];

3. Следуя некоторым учебникам от appsmuck.com, я увидел, что они используют:

"(void) loadFlipsideViewController"

, нонет «loadView», поэтому мы можем заменить «View» на представление контроллера?

4. Наконец, я могу переключиться с симулятора «iphone» на симулятор «ipad», но я всегда получаю симулятор ipadкаждый раз, когда я собираю проект, есть ли способ, чтобы симулятор "iphone" был симулятором по умолчанию?

И все.:) Спасибо за помощь

Пол

Ответы [ 3 ]

1 голос
/ 29 июня 2011

1. Шаблон проектирования делегирования

Шаблон проектирования делегирования - это способ изменения сложных объектов без их наследования.Вместо того, чтобы создавать подклассы, вы используете сложный объект как есть и помещаете любой пользовательский код для изменения поведения этого объекта в отдельный объект, который называется объектом делегата.В заранее определенное время сложный объект затем вызывает методы объекта делегата, чтобы дать ему возможность запустить свой собственный код.

2.Причиной создания еще одного viewController является управление памятью.Это можно сделать в одну строку, но тогда вы будете без необходимости добавлять объект в пул автоматического выпуска.

//Now the autorelease pool has to track this object
self.mainViewController =  [[[MainViewController alloc] initWithNibName:@"MainView" bundle:nil] autorelease];

3.-(void)loadView наследуется от UIViewController, поэтому вы не можете просто изменить его на loadViewController, потому что это просто создаст пользовательский метод.Это именно то, что (void)loadFlipsideViewController пытается выполнить, и по его имени он должен загрузить новый контроллер представления и отобразить его с помощью анимации.

4.В XCode 4 вам нужно установить схему на правильный симулятор.

1 голос
/ 29 июня 2011

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

Тем не менее, я сделаю снимок № 1.

Многие типы объектов в Какао (иКакао Touch) отправлять сообщения.Некоторые, например NSFetchedResultsController, отправляют сообщения, когда их содержимое изменяется.Некоторые, например UITableViewController, отправляют сообщение при касании ячейки таблицы.Эти сообщения должны идти куда-то.Они не могут быть отправлены просто "там", или ничто их никогда не услышит.Этим сообщениям нужен пункт назначения.В Какао пункт назначения для этих сообщений называется «делегатом».Например, «я назначаю этот объект моим делегатом и получаю мои сообщения».

Если вы находитесь в viewController, который управляет UITableView, очень часто имеет смысл просто указать «self» какделегировать.То есть, по сути, мистер UITableView, просто отправьте мне свои сообщения, я их обработаю.В свою очередь, ваш viewController должен объявить (в .h), что они соответствуют протоколу UITableViewDelegate, а затем необходимые методы в этом протоколе должны быть реализованы в вашем .m.

Это ОЧЕНЬ распространенный шаблон вКакао.Не продолжай, пока не поймешь.

0 голосов
/ 29 июня 2011

Для делегата вы можете проверить использование Делегата в iphone SDK .У меня длинный ответ там .

@property (nonatomic, retain) MyClass *obj;

MyClass *tmpObj = [[MyClass alloc] init];
self.obj = tmpObj;
[tmpObj release];

Давайте посмотрим, что здесь происходит.[MyClass alloc] выделяет объект, и вы сохраняете счет 1. В следующей строке вы вызываете сеттер, который также сохраняет.Таким образом, вы увеличиваете счет удержания.Естественно, вы освободите это свойство позже, может быть в dealloc.Так что теперь вы являетесь владельцем этого объекта 2 раза.Для совпадения с первым владельцем через alloc вы отпускаете в 3-й строке.

Теперь посмотрим, что произойдет, если вы сделаете это в одной строке:

self.obj = [[MyClass alloc] init];

Вы получили право владения здесь два раза, один - через alloc и один - через свойство keep.Так что вам нужно написать [obj release] дважды.В противном случае у вас будет утечка памяти.Но выпуская дважды, это сбивает с толку и легче создать ошибку, и вы никогда не должны этого делать.Или вам нужно автоматически выпустить это в той же строке, что также сбивает с толку.

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

Извините, я не могу помочь с другими частями.

...