Definicje @property z ARC: mocne czy zachowane?

80

Używając Xcode 4.2 i ARC, zauważyłem, że automatycznie wygenerowany kod dla NSManagedObjectnadal brzmi tak dla właściwości:

@property (nonatomic, retain) NSString * someString;

1) Nie należy retainteraz zamieniać na stronglub weak?

2) Dlaczego kod generowany automatycznie jest nadal używany retain

3) Jaki jest prawidłowy zamiennik retainw tym oświadczeniu o właściwościach?

Obecnie debuguję problem za pomocą NSFetchRequesti pomyślałem, że może to być źródło problemu. Myśli?

one09jason
źródło
Powinieneś już teraz przyjąć odpowiedź.
Rivera,

Odpowiedzi:

110

1) Czy nie należy teraz zastępować zachowania mocnym lub słabym?

Nie. Nie możesz zastąpić retencji słabym; oni są różni. Silny jest w 100% synonimem zachowania; są identyczne. Możesz użyć dowolnego, więc nie ma tutaj „powinno”. Możesz zastąpić retain na mocny, jeśli chcesz, ale nie musisz.

2) Dlaczego wygenerowany automatycznie kod nadal korzysta z funkcji retain

Dlaczego nie? Zobacz (1). zachowanie jest prawidłowe, więc nie ma problemu.

3) Jaki jest prawidłowy zamiennik zachowania w tym oświadczeniu o własności?

Nie ma potrzeby wymiany retencji.

Obecnie debuguję problem przy użyciu NSFetchRequest i pomyślałem, że może to być źródło problemu. Myśli?

Tak nie jest.

matowe
źródło
9
Ale założyłbym, że dla społeczności mającej obsesję (i słusznie!) Na temat standardów i zgodności z Apple Way (s), zachowanie tylko w zsyntetyzowanych modelach jest kiepskie. Zmieniam się na silnego, żeby być pedantycznym. Po pierwsze, sprawia, że ​​potwierdzenie dużego projektu pod kątem niewłaściwej składni jest trochę łatwiejsze, pośród kilku innych drobiazgów.
Eric Goldberg,
12
Nie jestem pewien, czym jest architektura emocjonalna. Czy możesz podać przykład w „zimnym, przejrzystym świetle dnia”? ;-) false i NO są synonimami, ale w Objective-C używamy NO zgodnie z konwencją. Istnieją powody, by być konsekwentnym; bycie niekonsekwentnym jest w porządku, ale ciężar udowodnienia swojej wartości spoczywa na tym, kto łamie konwencję, a nie na tym, kto jej przestrzega.
Eric Goldberg
9
Z całym szacunkiem @EricGoldberg ma rację: liczy się konwencja. A ponieważ będziesz __strongw innych miejscach w swoim kodzie (nie ma __retain), możesz chcieć przełączyć się na używanie strongdla spójności. Jest to podobne do wcięcia kodu w spójny sposób, mimo że kod będzie działał dobrze bez tego.
Dan Rosenstark
3
@matt: jeśli spojrzysz na mój oryginalny komentarz, ten, w którym oskarżyłeś mnie o kodowanie „emocjonalnie” (cokolwiek to jest), zobaczysz, że używam słów „posit” i „tylko po to, by być pedantycznym”. Właściwie sugeruję, że „powinien”, a nie „jest”.
Eric Goldberg
1
WSZYSTKIE PROGRAMOWANIE dotyczy idiomu. Nie ma innych problemów. Całe programowanie jest synonimem, cała inżynieryjna praktyka programowania polega na używaniu obecnego idiomu, aby dodać wartość do kodu dla klienta.
Fattie
40

Aby odpowiedzieć na wszystkie trzy pytania w jednym: retaini strongsą ze sobą równoznaczne, więc oba są poprawne. Dokumentacja stwierdza

retainzakłada __strongwłasność

strongzakłada __strongwłasność

Phlibbo
źródło
Dzięki za odpowiedzi. Przeczytałem dokument Apple na temat ARC. Rozumiem, że zachowanie przekłada się na silne. Jednak to nie wyjaśnia, dlaczego kod, który jest automatycznie generowany przez Xcode podczas tworzenia nowych obiektów NSManagedObject (s) da ci @property (nonatomic, retain)
one09jason
3
Chyba że czegoś mi brakuje, to doskonale to wyjaśnia. Kod, który tworzy Xcode, jest poprawny, ponieważ retain działa równie silnie, więc gdzie jest twoje pytanie?
Phlibbo
6
Jeśli uruchomisz refaktoryzację ARC w swoim projekcie, przekształci wszystkie te zmiany retainw strongs. Mam wrażenie, że strongjest to preferowany atrybut, ale generator NSManagedObject nie został zaktualizowany. Ale to tylko przypuszczenie; być może nikt w Apple nie uważa tego rozróżnienia za ważny.
teoria
4

Przed ARC musisz „zwolnić” obiekt, który został zachowany. Oznacza to, że zatrzymanie ma część przeciwną. Po ARC nie musisz zwolnić. Więc używaj silnego. To wizualna wskazówka, że ​​nie musisz dzwonić do wydania.

user2488343
źródło
3

„zachować” jest równe „silnemu”.

„silny” jest używany na przykład:

@property (nonatomic, strong) NSString * someString;

A „__strong” jest używane na przykład:

-(void) someMethod
{
    __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
}

W Apple Docs. mówi:

Atrybuty właściwości

Słowa kluczowe słabe i silne są wprowadzane jako nowe zadeklarowane atrybuty właściwości, jak pokazano w poniższych przykładach.

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
property(strong) MyClass *myObject;

Apple doc. http://developer.apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

Alex
źródło