Разница между объявлением @interface и объявлением @property

Я предлагаю:

System.Reflection.Assembly thisExe;
thisExe = System.Reflection.Assembly.GetExecutingAssembly();
System.IO.Stream file = 
    thisExe.GetManifestResourceStream("AssemblyName.ImageFile.jpg");
Image yourImage = Image.FromStream(file);

Из msdn: http://msdn.microsoft.com/en-us/library/aa287676 (v = vs.71) .aspx

Использование Image.FromStream лучше, потому что вам не нужно знать формат изображения (bmp, png, ...).

29
задан Nigel 29 January 2010 в 03:33
поделиться

4 ответа

Здесь вы объявляете переменную экземпляра с именем aVar:

@interface myclass : UIImageView {
    int aVar;
}

Теперь вы можете использовать эту переменную в своем классе:

aVar = 42;
NSLog(@"The Answer is %i.", aVar);

Однако в Objective-C переменные экземпляра являются приватными. Что делать, если вам нужно, чтобы другие классы могли получить доступ и/или изменить aVar? Так как методы в Objective-C являются публичными, то ответ заключается в том, чтобы записать метод доступа (getter), который возвращает aVar, и метод мутатора (setter), который устанавливает aVar:

// In header (.h) file

- (int)aVar;
- (void)setAVar:(int)newAVar;

// In implementation (.m) file

- (int)aVar {
    return aVar;
}

- (void)setAVar:(int)newAVar {
    if (aVar != newAVar) {
        aVar = newAVar;
    }
}

Теперь другие классы могут получить и установить aVar с помощью:

[myclass aVar];
[myclass setAVar:24];

Запись этих методов доступа и мутатора может стать довольно утомительной, поэтому в Objective-C 2.0 компания Apple упростила ее для нас. Теперь мы можем написать:

// In header (.h) file

@property (nonatomic, assign) int aVar;

// In implementation (.m) file

@synthesize aVar;

...и методы доступа/мутатора будут автоматически сгенерированы для нас.

Подводя итог:

  • int aVar; объявляет переменную экземпляра aVar

  • @property (nonatomic, assign) int aVar; объявляет методы доступа и мутатора для aVar

  • @synthesize aVar; реализует методы доступа и мутатора для aVar

57
ответ дан 28 November 2019 в 01:08
поделиться

Я не могу говорить за стороной WSDL, но вы можете рассмотреть Metawidget для со стороны поколения формы: после того, как вы выделяете и анализируете WSDL, вы можете Нажмите в Metawidget и получите много добра для пользовательского интерфейса бесплатно (поддержка разных платформ, различных библиотек виджетов и т. Д.)

С уважением,

Ричард.

-121--3926620-

@Interface объявляет экземпляры переменных класса в OBJ-C. Вам нужно, чтобы создать переменную экземпляра. Однако переменная не видна вне класса по умолчанию (поскольку поле по умолчанию защищена).

@Property сообщает компилятору, чтобы указать конкретный метод доступа к свойствам (Get / Set). Тем не менее, вам нужно будет использовать @synTheSize на самом деле, чтобы компилятор автоматически генерировать простые доступности, в противном случае вы, как ожидается, создадут их самостоятельно.

0
ответ дан 28 November 2019 в 01:08
поделиться

Это объявляет переменную экземпляра в вашем объекте:

@interface myclass : UIImageView {
    int aVar;
}

Переменные экземпляра являются частными деталями реализации вашего класса.

Если вы хотите, чтобы другие объекты могли читать или установить значение переменной экземпляра (IVAR), вы можете объявить его в качестве свойства:

@property int aVar;

Это означает, что компилятор ожидает, чтобы увидеть методы доступа к сетте и доступу недвижимость.

Когда вы используете ключевое слово @synThesize, вы просите компилятора автоматически генерировать методы Access accessor и Getter.

Итак, в этом случае компилятор будет генерировать код, аналогичный этому, когда он столкнулся с ключевым словом @synThesize:

- (int) aVar
{
    return aVar;
}

- (void)setAVar:(int)someInt
{
    aVar = someInt;
}

по умолчанию на iPhone (и на 32-битной среде выполнения на Mac), @synThesize Требуется присутствующая переменная экземпляра для хранения значения свойства. Этот Ивар обычно назван таким же, как имущество, но не должно быть, например, вы могли бы сделать это:

@interface myclass : UIImageView {
    int aVar;
}

@property int someValue;

@synthesize someValue = aVar;

ни @synThesize , ни @Property на самом деле требуются , вы можете создать свои собственные методы Getter и Setter, и если вы создаете их, используя их, используя синтаксис, совместимый с кодированием клавиш, свойство все равно будет использоваться.

Требование для присутствия ивера Ивара, а также @Property @Property Декларация , является хрупким базовым классом ограничения 32-битной среды выполнения объекта-C на обоих Mac и iPhone. С 64-битной средой выполнения на Mac вам не нужен Ивар, @synThesize генерирует один для вас.

Обратите внимание, что есть многочисленные ключевые слова, которые вы можете использовать с вашим @Property объявлением, чтобы контролировать, какой тип синтезированного Accessor Code создается, например readonly для доступа для доступа, Копия , атомный , нетомический И так далее. Более подробную информацию находится в языке программирования объекта-C 2.0 .

12
ответ дан 28 November 2019 в 01:08
поделиться

Классы могут иметь переменные экземпляра (ivars). Они находятся в первом разделе и видны только коду в этом классе, но не внешнему коду. Мне нравится ставить перед ними знак подчеркивания, чтобы показать их внутреннюю сущность. Говоря языком низкого уровня, ivars добавляются в качестве дополнительного члена к структуре, которую создаваемый вами класс использует для внутренних целей.

Второе объявление, @property, является объявленным свойством. Это не обязательно (кроме случаев, когда вы используете @synthesize), но это помогает другим программистам (и компилятору!) Знать, что вы имеете дело со свойством, а не только с двумя методами -setAVar и ] -aVar , альтернативный способ сделать это.

В-третьих, @synthesize фактически создает методы для установки и доступа к свойству извне класса. Вы можете заменить это своими собственными методами установки и получения, но делайте это только при необходимости, поскольку встроенные имеют некоторые функции, которые в противном случае вам пришлось бы кодировать самостоятельно.Фактически, используя синтаксис @synthesize aVar = _someVariable; , вы можете сделать так, чтобы ваше свойство действительно ссылалось на переменную экземпляра с другим именем!

Краткая версия: @property - это просто намек для компилятора и других программистов, что вы создаете свойство, а не только методы получения / установки. Переменные экземпляра являются внутренними по отношению к классу, и в противном случае к ним невозможно получить доступ извне. @Synthesize просто создает для вас простые геттеры и сеттеры для использования с вашим @property, но вы также можете просто кодировать эти геттеры и сеттеры, как и любой другой метод.

1
ответ дан 28 November 2019 в 01:08
поделиться