Нужно ли иметь @ свойства здесь? - PullRequest
0 голосов
/ 24 июня 2011

По сути, я хочу иметь возможность доступа к свойству window делегата UIApplication через мой класс, поэтому я хочу ссылаться на него с помощью iVar.

С этой целью я не хочу"владеть" им, просто ссылаться на него.

Поэтому, поэтому я должен просто поместить ссылку на переменную в файл .h?

#import <UIKit/UIKit.h>


@interface MessageView : UIView {
    UILabel *messageLabel;
    UIWindow *window;
}

@property (nonatomic, retain) UILabel *messageLabel;

@end

Или я тоже должен установить свойство там?

Я скептически отношусь, потому что свойство будет nonatomic, retain, но я не хочу его сохранять, если я на самом деле не делаю, и я просто толстый!: p

Цель иметь объект окна - просто иметь возможность добавлять к нему подпредставления, а не текущее представление контроллера представления.

Спасибо

Ответы [ 3 ]

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

Почему бы не использовать

@property (nonatomic, assign) UIWindow *window

Тогда вы его не удерживаете.

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

Наличие свойства на первом месте в этом сценарии - не что иное, как синтаксический сахар

someclass.window = self.window; // Using a property

гораздо более краткий, чем

window = [UIApplication sharedApplication].window; // Using an iVar
0 голосов
/ 24 июня 2011

Вообще-то нет.

Каждый раз, когда вы используете какой-либо из UIWindow Make Key Window методов (как вы, вероятно, делаете внутри вашего AppDelegate), например

- makeKeyAndVisible
- makeKeyWindow

Окно становится доступным из всех ваших приложений, просто используя свойство UIApplication's keyWindow .

[[UIApplication sharedApplication] keyWindow]

Таким образом, в вашем AppDelegate или где-либо еще не требуется свойство или удержание, поскольку оно будет сохранено вашим классом приложения.

OBS: свойство обычно помещается в ваш AppDelegate, так как шаблон приложения из XCode использует конструктор интерфейса и IBOutlet для создания экземпляра UIWindow. Таким образом, если вы создаете окно вручную, вам не нужно там ничего делать.

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

Ну, вы действительно хотите сохранить UIWindow. Новые проекты по умолчанию сохраняют его, и в этом нет ничего плохого. Я вижу, что MessageView наследуется напрямую от UIView и у него есть свойство окна, которое устанавливается после его добавления в окно (или подпредставление окна). Также посмотрите на willMoveToWindow: и didMoveToWindow. Теперь никогда не думайте, что вы не можете создать свойство только потому, что не хотите что-то сохранять, потому что именно для этого используется ключевое слово assign.

#import <UIKit/UIKit.h>


@interface MessageView : UIView {
    UILabel *messageLabel;
    UIWindow *window;
}

@property (nonatomic, retain) UILabel *messageLabel;
@property (nonatomic, assign) UIWindow *window;

@end
...