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. 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ą instancjiaVar
@property (nonatomic, assign) int aVar;
deklaruje metody accessor i mutator dlaaVar
@synthesize aVar;
wdraża metody accessor i mutator dlaaVar
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.
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.
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.
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.
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;
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