@ property i @ synthesize w objective-c

Podczas gry i dowiedzieć się, jak to działa w https://github.com/enormego/EGOTableViewPullRefresh znalazłem tajemnicę @ property i @synthesize. Oto Kod, o którym wspomniałem

EGORefreshTableHeaderView.h

@interface EGORefreshTableHeaderView : UIView {
    id _delegate;
    EGOPullRefreshState _state;

    UILabel *_lastUpdatedLabel;
    UILabel *_statusLabel;
    CALayer *_arrowImage;
    UIActivityIndicatorView *_activityView;
}

@property(nonatomic,assign) id <EGORefreshTableHeaderDelegate> delegate;

EGORefreshTableHeaderView.m

@synthesize delegate=_delegate;

Przeczytałem to http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html{[4]i z tego co rozumiem to tworzy nowa nazwa _delegate, która jest delegatem. (Czy mam rację z tym zrozumieniem ?)

Ale nadal nie rozumiem, dlaczego muszą komplikować sprawę z tymi @ synthesize = directive.

Author: Electric Coffee, 2011-04-28

2 answers

Jak bardzo to skomplikowane? To tylko fragment składni, który pozwala określić ivar, którego chcesz użyć do utworzenia właściwości, dla której mówisz kompilatorowi, aby utworzył accessory. Jeśli nie podali tego lub czegoś równoważnego, zawsze musisz mieć nazwy nieruchomości zgodne z nazwami ivar i istnieją powody, dla których możesz tego nie chcieć.

Jeśli nie musisz nazywać swoich ivarów inaczej, nie musisz zawracać sobie głowy określaniem nazwy Ivara. W rzeczywistości nie musisz w ogóle tworzyć ivarów dla swoich właściwości... jeśli tego nie zrobisz, kompilator stworzy je za Ciebie.

Update: od połowy 2013 roku LLVM domyślnie syntetyzuje Accesory dla właściwości, więc w większości przypadków nie musisz już w ogóle podawać @synthesize. Jedynym przypadkiem, w którym nadal będziesz go używać, jest to, że chcesz przywrócić właściwość za pomocą innej zmiennej instancji niż ta, którą kompilator wygenerowałby dla Ciebie. Również domyślna nazwa dla ivar, który wspiera właściwość, będzie nazwą właściwości poprzedzoną podkreśleniem. Tak więc kod w przykładzie OP można uprościć usuwając wiersze:

id _delegate;

I:

@synthesize delegate=_delegate;

Usunąłem moją wcześniejszą radę przeciwko używaniu prefiksu podkreślenia, ponieważ wyraźnie nie zgadzało się to z obecną modą i domyślnym zachowaniem kompilatora. Z tego, co wiem, nadal jest słaba forma, aby używać prefiksu podkreślenia dla nazw metod.

Również, to przyszło do mojego Uwaga, że przynajmniej jedna osoba zinterpretowała pierwszą linijkę mojej odpowiedzi: "jak bardzo to skomplikowane?"jako protekcjonalny. Mam nadzieję , że to było tylko wrażenie jednej osoby. na pewno nie zamierzałem protekcjonalnie, ale starałem się tylko oprawić moją odpowiedź wokół twierdzenia OP, że dyrektywa @synthesize xxx=_xxx; komplikuje sprawy. Mamy nadzieję, że nowe zachowanie "synthesize by default" zmniejszy obciążenie dla nowych graczy.

 30
Author: Caleb,
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-08-22 12:39:22

Masz rację, używając

@synthesize foobar=_foobar;

W większości przypadków jest to trochę bezcelowe, ale na poziomie abstrakcyjnym pozwala całkowicie zwrócić wartość innej zmiennej. Czyli ...

@synthesize foobar=fluffybunny;

Pozwala uzyskać lub ustawić wartość fluffybunny za każdym razem, gdy używasz accesora .foobar

Jednak jeśli chodzi o złożoność@synthesize, wolałbyś napisać

-(void)setFoobar:(id)aobject {
    [self willSetValueForKey:"foobar"];
    id old = foobar;
    foobar = [aobject retain];
    [old release];
    [self didSetValueForKey:"foobar"];
}

-(id)foobar {
    [self willAccessValueForKey:"foobar"];
    id obj = [self primitiveValueForKey:@"foobar"];
    [self didAccessValueForKey:"foobar"];    
    return obj;
}

Lub

@synthesize foobar;

To nie jest szczególnie dobrze napisane, ponieważ zapomniałem, jak zrobić je dobrze, ale @ synthesize To jedna z rzeczy, które mocno zasysały Obj-C 1.0.

Darmowy kod, dont knock it.

 17
Author: Warren Burton,
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
2014-05-22 13:01:51