Różnica między deklaracją @ interface a deklaracją @ property

Jestem nowy w C, nowy w objective C. Dla podklasy iPhone, im deklarując zmienne chcę być widoczny dla wszystkich metod w klasie do definicji klasy @ interface np

@interface myclass : UIImageView {
    int aVar;
}

A potem ogłaszam to ponownie jako

@property int aVar;

A potem ja

@synthesize aVar;
Czy możesz mi pomóc zrozumieć cel trzech kroków? Robię coś niepotrzebnego? Dzięki.
Author: Nigel , 2010-01-29

6 answers

Tutaj deklarujesz zmienną instancji o nazwie aVar:

@interface myclass : UIImageView {
    int aVar;
}

Możesz teraz używać tej zmiennej w swojej klasie:

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

Zmienne instancji są jednak prywatne w Objective-C. Co zrobić, jeśli potrzebujesz innych klas, aby mieć dostęp i / lub zmienić aVar? Ponieważ metody są publiczne w Objective-C, odpowiedzią jest napisanie metody accessor (getter), która zwraca aVar i metody mutator (setter), która ustawia 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;
    }
}

Teraz inne klasy mogą dostać i ustawić aVar via:

[myclass aVar];
[myclass setAVar:24];
[16]}pisanie tych metod accessor i mutator może być dość żmudne, więc w Objective-C 2.0 Apple uprościło to dla nas. Możemy teraz napisać:
// In header (.h) file

@property (nonatomic, assign) int aVar;

// In implementation (.m) file

@synthesize aVar;

...a metody accessor / mutator zostaną automatycznie wygenerowane dla nas.

Podsumowując:

  • int aVar; deklaruje zmienną instancji aVar

  • @property (nonatomic, assign) int aVar; deklaruje metody accessor i mutator dla aVar

  • @synthesize aVar; wdraża metody accessor i mutator dla aVar

 55
Author: Steve Harrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 04:09:50

To deklaruje zmienną instancji w Twoim obiekcie:

@interface myclass : UIImageView {
    int aVar;
}

Zmienne instancji są prywatnymi szczegółami implementacji twojej klasy.

Jeśli chcesz, aby inne obiekty mogły odczytywać lub ustawiać wartość zmiennej instancji (ivar), możesz zadeklarować ją jako właściwość:

@property int aVar;

To oznacza, że kompilator spodziewa się widzieć metody setter i getter accessor dla właściwości.

Gdy używasz słowa kluczowego @ synthesize, prosisz kompilator o automatycznie Generuj metody setter i getter accessor dla Ciebie.

Tak więc, w tym przypadku kompilator wygeneruje kod podobny do tego, gdy napotka słowo kluczowe @ synthesize:

- (int) aVar
{
    return aVar;
}

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

Domyślnie na iPhonie (oraz w 32-bitowym środowisku uruchomieniowym na Macu), @synthesize wymaga obecności zmiennej instancji w celu przechowywania wartości właściwości. Ten ivar jest zwykle nazywany tak samo jak właściwość, ale nie musi być, na przykład można zrobić to:

@interface myclass : UIImageView {
    int aVar;
}

@property int someValue;

@synthesize someValue = aVar;

Ani @synthesize ani @property nie są w rzeczywistości wymagane, możesz tworzyć własne metody getter i setter i tak długo, jak utworzysz je przy użyciu składni zgodnej z kodowaniem wartości klucza, właściwość będzie nadal użyteczna.

Wymóg, aby ivar był obecny, jak również deklaracja @property wynika z fragile base class ograniczenia 32-bitowego trybu runtime Objective-C zarówno na Macu, jak i iPhonie. Z 64-bitowym uruchomieniem na komputerze Mac nie potrzebujesz ivar, @synthesize generuje jeden dla Ciebie.

Zauważ, że istnieje wiele słów kluczowych, których możesz użyć w deklaracji @property, aby kontrolować, jakiego rodzaju tworzony jest syntetyzowany kod accesora, na przykład readonly dla accesora tylko dla gettera, copy, atomic, nonatomic i tak dalej. Więcej informacji znajduje się w dokumentacji języka programowania Objective-C 2.0.

 11
Author: Rob Keniger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 03:53:30

Klasy mogą mieć zmienne instancji (ivars). Są one w pierwszej sekcji i są widoczne tylko dla kodu w tej klasie, a nie dla kodu zewnętrznego. Lubię przedrostek z podkreśleniem, aby pokazać ich wewnętrzną-ness. W ujęciu niskopoziomowym, ivars są dodawane jako dodatkowy element do struktury, której klasa, którą tworzysz, używa wewnętrznie.

Druga deklaracja, @ property, jest zadeklarowaną własnością. Nie jest wymagany (z wyjątkiem sytuacji, gdy używasz @ synthesize), ale pomaga innym programistów (i kompilatora!) wiedz, że masz do czynienia z właściwością, a nie tylko z dwiema metodami -setAVar i -aVar, które są alternatywnym sposobem na to.

Po Trzecie, @ synthesize tworzy metody ustawiania i uzyskiwania dostępu do właściwości spoza klasy. Możesz to zastąpić własnymi metodami setter i getter, ale rób to tylko wtedy, gdy potrzebujesz, ponieważ wbudowane mają pewne funkcje, które w przeciwnym razie musiałbyś sam zakodować. W rzeczywistości, używając składni @synthesize aVar = _someVariable;, twoja właściwość może rzeczywiście odwoływać się do zmiennej instancji o innej nazwie!

Krótka wersja: Właściwość @jest tylko wskazówką dla kompilatora i innych programistów, że tworzysz właściwość, a nie tylko metody getter / setter. Zmienne instancji są wewnętrzne klasy i w przeciwnym razie nie mogą być normalnie dostępne spoza niej. @Synthesize tworzy proste gettery i settery dla ciebie, aby pasowały do Twojej właściwości@, ale możesz również po prostu kodować te gettery i settery siebie, jak każda inna metoda.

 1
Author: Grant Paul,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 03:45:41

@ interface deklaruje zmienne instancji klasy w Obj-c. potrzebujesz ich do utworzenia zmiennej instancji. Jednak zmienna nie jest domyślnie widoczna poza klasą(ponieważ pole jest domyślnie chronione).

@ property mówi kompilatorowi, aby podał konkretną metodę dostępu do właściwości (get / set). Jednak będziesz musiał użyć @synthesize, aby kompilator generował proste accessory automatycznie, w przeciwnym razie będziesz musiał tworzyć je samodzielnie.

 0
Author: futureelite7,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-01-29 03:43:20

Ostatnio zacząłem uczyć się aplikacji na iphone ' a. Według mojej wiedzy @ property jest używany w .plik h jako metoda settera i @ synthesize in .plik m jako metoda getter. W Javie używamy metod setter i getter, tak samo jak w Javie, w Objective C używamy @ property i @synthesize.

Proszę wybacz mi, jeśli myślisz, że cię wprowadzam w błąd.

 0
Author: Raviraja,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-25 08:21:22
Class A      

      @interface myclass : UIImageView {
    int aVar;
}

If you declare like this then you can only use this variable within your class A.


But suppose in Class B

    A *object=[A new];
object.aVar---->not available



For this you should **declare aVar as a property in Class A**

so class A should look like 

Class A      

  @interface myclass : UIImageView {
    int aVar;
}
@property int iVar;


and 


.m file 
@synthesize iVar;



So now you can use this iVar in another class Suppose B


 Class B
#import "Class A.h"

    enter code here

A *object=[A new];
object.aVar---->available
means
object.aVar=10;
 0
Author: Jøhn Nârrøw,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-05-29 10:55:35