сохранить данные участника и уведомления - PullRequest
0 голосов
/ 29 июля 2010

Просто нужно два действительно базовых пояснения.

1.

Допустим, у меня есть класс A, в котором член объявлен как:

@property (nonatomic,retain) NSString* stringInstanceVariable;

В одном измои методы, я хочу инициализировать stringInstanceVariable, чтобы быть некоторой строкой.Нужно ли мне его сохранять или нет?

мне позвонить:

stringInstanceVariable = [[NSString stringWithCString:"Hello"] retain];

или

stringInstanceVariable = [NSString stringWithCString:"Hello"];

Или, может быть, мне следует позвонить:

self.stringInstanceVariable = [NSString stringWithCString:"Hello"];

2.

Используя конструктор интерфейса, когда я, например, щелкаю правой кнопкой мыши элемент управления текстовым полем, я получаю список методов.что это такое?Уведомление, что я могу зарегистрироваться, чтобы наблюдать?И я знаю, что могу реализовать, а затем соединить их, используя IB, я просто хочу знать, могу ли я, например, сделать это без IB, используя только код.Может быть, я могу сделать это с помощью «addTarget: action: forControlEvent».

Но если это так, то в чем разница между событиями и уведомлениями в Какао?или сравнение с делегированием более уместно.

Ответы [ 2 ]

0 голосов
/ 29 июля 2010

Чтобы ответить на ваш второй вопрос, существует UITextFieldDelegate protocol, который определяет своего рода "контракт" методов, которые делегат соглашается реализовать (если они не определены как необязательные).

В Интерфейсном Разработчике вы подключаете свой контроллер представления как текстовое поле delegate.Присвоение вашему контроллеру представления делегата означает, что вы согласны установить не обязательные методы в контроллере представления, которые вызываются, когда что-то происходит в текстовом поле или в текстовом поле.

Например, делегат -textFieldDidBeginEditing метод вызывается, когда пользователь начинает редактировать текст в текстовом поле.Вы бы поместили здесь код, если он вам полезен, чтобы отслеживать, когда текстовое содержимое поля может быть изменено.Существуют и другие методы делегатов, которые вы можете (необязательно) реализовать.

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

Уведомления отличаются от делегатов тем, что обычно используется только один экземпляр объекта.установить быть делегатом другого объекта.Уведомления полезны, когда вы хотите, чтобы несколько объектов могли прослушивать что-то, происходящее в другом объекте.Центр уведомлений передает уведомления любым зарегистрированным объектам для их прослушивания.Затем зарегистрированные объекты соглашаются запустить метод («селектор» на языке Objective-C) при получении уведомления.

0 голосов
/ 29 июля 2010

На самом деле ни один из них, поскольку -stringWithCString устарел.

Вы можете использовать -stringWithCString:encoding:, предоставляя строку с нулевым символом в конце и тип NSStringEncoding, например:

self.stringInstanceVariable = [NSString stringWithCString:"Hello" encoding:NSUTF8Encoding];

В этом примере любой C-струной, в которую вы вводите, должен быть UTF-8.В зависимости от вашего приложения могут быть другие кодировки.

Вы хотите использовать self, чтобы получить доступ к установщику свойства.

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

Однако, если бы вы использовали alloc-init для настройки NSString, используя -initWithCString:encoding, вам нужно будет автоматически выпустить его, например:

self.stringInstanceVariable = [[[NSString alloc] initWithCString:"Hello" encoding:NSUTF8Encoding] autorelease];

Это эквивалентно (с точки зрения управления памятью):

NSString *_tempString = [[NSString alloc] initWithCString:"Hello" encoding:NSUTF8Encoding];
self.stringInstanceVariable = _tempString;
[_tempString release];

Это немного усложняется, но некоторые предпочитают этот последний метод, хотя это больше кода, так как вы явно выпускаете _tempString сразу после того, как он сохраняется stringInstanceVariable.При первом подходе autorelease в конечном итоге дойдет до освобождения временной переменной, но если вы хотите сохранить свой профиль памяти сжатым, о втором подходе стоит подумать.

...