Я хочу понять, когда использовать @property против переменных экземпляра

Я некоторое время изучаю Obj-C, и у меня есть фундаментальный вопрос. Кажется, что в моем коде повсюду слишком много "я". Я считаю, что это сводится к основному вопросу о различиях между двумя способами объявления и использования переменных.

Прикреплен код, который поддерживает мой вопрос. В нем есть две переменные, объявленные (в разных местах) и используемые в методе для одного и того же: optionA и optionB. Я не уверен, какой из них использовать. Я подумал, что это может быть потому, что использование "свойства", как показано с параметром B, гарантирует, что я получу методы доступа (установщик и получатель), но я вижу, что у optionA, по-видимому, есть установщик.

Я предпочитаю вариант А, потому что это означает, что мне не нужно "я" повсюду, но я хочу понять последствия использования одного над другим.

В программе, над которой я работаю, все переменные объявлены как свойства (как опция B ниже), но я должен использовать 'self' при доступе к ним. Мне интересно, если это правильно, и просто артефакт правильного способа сделать что-то, или я совершенно не в своем вкусе и должен использовать другую форму, например, вариант OptionA.

Когда / Почему кто-то объявит переменную между фигурными скобками интерфейса (например, optionA)?

Я перебирал ответы на вопросы, но не нашел ни одного, который мог бы сказать мне, что я пытаюсь здесь изучить. Но я не могу найти информацию, которую я ищу в других вопросах или их ответах.

У меня есть изображение кода здесь (но у меня нет очков престижа, чтобы разрешить связывать его непосредственно с этим сообщением, очевидно): http://i1127.photobucket.com/albums/l631/GenericImage/headerQueryOBJC.jpg

вот списки:

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate> {
    IBOutlet NSTextField *optionA;

}

- (IBAction)happy:(id)sender; 
@property (assign) IBOutlet NSWindow *window; 
@property (weak) IBOutlet NSTextField *optionB; 
@end 

реализация

#import "AppDelegate.h" 

@implementation AppDelegate 
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification 
{ 
     // Insert code here to initialize your application 
} 


-(IBAction)happy:(id)sender
{  
    [optionA setStringValue:@":-)"]; 
    [[self optionB] setStringValue:@":)"]; 
} 

@end 

1 ответ

Существует много сценариев, в которых использование свойства эквивалентно использованию переменной.

В описываемом вами сценарии, где ваша переменная и свойство относятся к объекту пользовательского интерфейса (IBOutlet) и связаны с Interface Builder, вы не увидите особой разницы, главным образом потому, что ваша переменная будет указывать на один и тот же объект на протяжении всей жизненный цикл его владельца (или контроллера, на жаргоне яблока)

Некоторые вещи, которые могут повлиять на сценарий:
- использование АРК
- модификаторы свойств (назначать, копировать...)
- привязки

Если вы используете ARC, более вероятно, что вы не видите четко разницу. Но когда не используется ARC, а наличие свойства с модификатором "copy" или "assign" позволяет увидеть разницу.

@property (retain) NSString *string;

string = someOtherString;

В этом примере перед назначением someOtherString ивар, связанный со свойством, освобождается от его предыдущего содержимого (и его счетчик сохранения уменьшается). Если вы не используете это свойство, вам придется самостоятельно обрабатывать повторный учет в каждом назначении, чтобы избежать записи в освобожденную память.

Другой пример: если вы используете привязки в своих проектах, вы увидите, что использования ivars недостаточно, потому что они не соответствуют KVC/KVO.

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

Другие вопросы по тегам