iPhone Objective-C Базовый пример Вопрос (о свойствах) - PullRequest
1 голос
/ 21 декабря 2009

Извините, я не мог дать более описательный заголовок. У меня вопрос (после просмотра кода ниже), что такое statusText . Это IBOutlet или UILabel? Как работает "@property (retain, nonatomic) UILabel * statusText"? Означает ли это утверждение, что statusText является свойством ???

Спасибо, что ответили. Если есть какие-либо вопросы, пожалуйста, не стесняйтесь комментировать.

Button_FunViewController.h

@interface Button_Fun2ViewController : UIViewController {
    IBOutlet UILabel *statusText;
}
@property (retain,nonatomic) UILabel *statusText;
- (IBAction)buttonPressed: (id)sender;

Button_FunViewController.m

@synthesize statusText;

- (IBAction)buttonPressed: (id)sender {
    NSString *title = [sender titleForState:UIControlStateNormal];
    NSString *newText = [[NSString alloc] initWithFormat:@"%@ button was pressed.", title];
    statusText.text = newText;
    [newText.release];  
}

Ответы [ 5 ]

2 голосов
/ 21 декабря 2009
  • что такое statusText?

statusText - это UILabel в вашем примере кода

  • Это IBOutlet или UILabel?

Оба.

UILabel - это тип (указатель на UILabel компонент, который вы используете в графическом интерфейсе)

IBOutlet помечает переменную для приложения Interface Builder, чтобы оно показывало его как Outlet. Во время компиляции IBOutlet компилируется, он определяется в NSNibDeclarations.h как:

#define IBOutlet

  • Как работает @property (retain,nonatomic) UILabel *statusText?

Вы можете создавать методы доступа (методы получения / установки) для переменной вручную, не нужно использовать свойство. Вы можете просто получить UILabel *statusText и реализовать свои методы получения / установки вручную.

Можно получить методы доступа, объявленные компилятором, определив переменную как @property, а затем либо использовать @synthesize для создания средств доступа в файле .m, либо снова объявить средства доступа самостоятельно (вы можете переопределить средства доступа по умолчанию, которые будут сгенерированы )

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

Вы можете использовать copy, retain или assign для сеттера (подробнее об управлении памятью о копировании / сохранении / назначении оптонов дерева)

Есть несколько других опций, например неатомных / атомарных, которые связаны с генерацией мьютексов и блокировок переменных перед доступом и т. Д. (Подробнее о свойствах )

Например, если у вас есть переменная

NSString * string;

определяя его как свойство readwrite, а затем синтезируя, вы получаете компилятор, сгенерированный для вас:

@property (copy, readwrite) NSString * string

затем используя

@synthesize string;

генерирует что-то вроде:

- (NSString *) string
{
    return string;
}

- (void)setString:(NSString *)str
{
    NSString * copy = [str copy];
    [string release];
    string = copy;
}
  • Означает ли это утверждение, что statusText является собственностью ???

Да, вы определили его как свойство, как описано выше.

Здесь есть пара понятий. Определение переменной, определяя ее как IBOutlet для Interface Builder, объявляет переменные как свойства, чтобы компилятор генерировал для вас методы получения / установки, определяя тип методов получения / установки, таких как метод доступа, управление памятью и блокировка.

Я надеюсь, что это объясняет ваши вопросы, и если вы перейдете по ссылке, Apple найдет объяснение, которое, как мне кажется, вполне понятно о том, как использовать свойства.

Извините за ужасное форматирование ...

2 голосов
/ 21 декабря 2009

statusText является переменной экземпляра типа UILabel*. Ключевое слово IBOutlet просто делает эту переменную экземпляра доступной для Interface Builder.

@property объявляет методы доступа и / или мутатора для данного свойства. Это эквивалентно объявлению -statusLabel и -setStatusLabel: методов.

Вы можете использовать @synthesize для автоматической реализации этих -statusLabel и -setStatusLabel: методов. Ключевые слова nonatomic и retain определяют поведение этих автоматически генерируемых методов.

Кроме того, вы можете самостоятельно реализовать методы -statusLabel и -setStatusLabel:.

2 голосов
/ 21 декабря 2009

IBOutlet ничего не оценивает, это просто подсказка Интерфейсному Разработчику, что это «соединение».

И да, statusText тогда является свойством.Для свойства требуется три оператора (в не «современной среде выполнения») - объявление ivar, оператор @property и оператор synthesize.

0 голосов
/ 21 декабря 2009

На самом деле в вашем примере есть две statusText "вещи". Существует объект statusText типа UILabel, и есть функция statusText, созданная @synthesize. Когда вы используете statusText внутри метода, вы ссылаетесь на объект, а не на функцию. Используйте self.statusText для использования свойства / функции.

0 голосов
/ 21 декабря 2009

Если вы добавите IBOutlet таким образом, это позволит вам связать элемент, пока вы находитесь в конструкторе интерфейсов.

После настройки IBOutlet вы можете открыть перо этого класса и затем выбрать владельца файла, затем перейти к инспектору и перетащить ссылку с вкладки «Подключения» на объект.

Это позволит вам затем внести изменения в объект в коде вашего класса, и он изменит связанный объект. Поэтому, когда вы свяжете «statusText» с определенной UILabel, вы можете использовать statusText.text = @"new text" в коде вашего класса, например, для изменения элемента.

Кроме того, IBAction позволяет создавать ссылки таким же образом. Вы можете перетащить соединение из события элемента управления в владельца файла, а затем выбрать любой метод в этом классе, для которого в качестве возвращаемого значения используется IBAction.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...