Różnica między platformą a biblioteką statyczną w xcode4 oraz sposób ich wywoływania

133

Jestem całkiem nowy w xcode i objective-c. Chcę zadać bardzo podstawowe pytanie.

Widziałem, że podczas „łączenia plików binarnych z bibliotekami” w ustawieniach projektu występują różnice dotyczące frameworka i bibliotek, importowanych z innych projektów w obszarze roboczym.

Pierwsze pytanie, dlaczego istnieje framework? A dlaczego jest biblioteka? Czy moja biblioteka nie może być frameworkiem?

A potem, z pliku .h , jak mogę wywołać klasy z mojej zaimportowanej biblioteki statycznej?

Przypuszczam, że musi istnieć przedrostek, ale nie mogłem go znaleźć. Ani „ProjName / Myclass.h” nie działa.

Proszę, bądź tak konkretny, jak tylko potrafisz.

Dzięki

Leonardo
źródło
To nie jest podstawowe pytanie
Masih

Odpowiedzi:

140

Największą zaletą frameworka w porównaniu z bibliotekami statycznymi jest to, że działają one jako zgrabny sposób pakowania skompilowanej biblioteki binarnej i wszelkich powiązanych nagłówków. Można je wrzucić do projektu (podobnie jak wbudowane frameworki SDK, takie jak Foundation i UIKit) i powinny po prostu działać (przez większość czasu).

Większość frameworków zawiera biblioteki dynamiczne; frameworki utworzone w Xcode przy użyciu szablonu Mac Framework utworzą bibliotekę dynamiczną. IPhone nie obsługuje struktur dynamicznych, dlatego często biblioteki wielokrotnego użytku kodu iOS są dystrybuowane jako biblioteki statyczne.

Biblioteki statyczne są w porządku, ale wymagają trochę dodatkowej pracy ze strony użytkownika. Musisz połączyć swój projekt z biblioteką i skopiować pliki nagłówkowe do projektu lub gdzieś się do nich odwołać, ustawiając odpowiednie ścieżki wyszukiwania nagłówków w ustawieniach kompilacji.

A więc: podsumowując, moim zdaniem najlepszym sposobem dystrybucji twojej biblioteki jest użycie frameworka. Aby stworzyć „statyczną” strukturę dla systemu iOS, można w zasadzie wziąć normalną strukturę i zastąpić plik binarny skompilowaną biblioteką statyczną. W ten sposób rozprowadzam jedną z moich bibliotek, Resty, i w ten sposób zamierzam rozprowadzać moje biblioteki w przyszłości.

Możesz spojrzeć na dostarczony plik Rakefile w tym projekcie (jeśli nie jesteś tego świadomy, Rake jest odpowiednikiem Make w Rubim). Mam kilka zadań do skompilowania mojego projektu (użycie xcodebuild) i spakowania ich jako statycznej struktury dla iOS. Powinieneś uznać to za przydatne.

Alternatywnie możesz użyć tych szablonów Xcode 4 do tworzenia struktury iOS.

Aktualizacja z 9 grudnia 2013 r . : to popularna odpowiedź, więc pomyślałem, że poprawię, aby powiedzieć, że zmienił się mój pierwszy wybór dystrybucji biblioteki. Moim pierwszym wyborem dla dowolnej biblioteki zewnętrznej jako konsumenta lub producenta jest CocoaPods. Dystrybuuję swoje biblioteki za pomocą CocoaPods i oferuję wstępnie skompilowaną bibliotekę statyczną z nagłówkami jako opcją rezerwową.

Luke Redpath
źródło
1
Tak więc biblioteki mogą być statyczne i dynamiczne, a frameworki to po prostu grupa bibliotek, która może być również dynamiczna lub statyczna. Czy to prawidłowe rozumienie?
Tony,
Wygląda na to, że platforma docelowa Xcode pozwala również kopiować nagłówki, ale nie pakować zasobów. Czy rozproszone biblioteki statyczne mogą również zawierać nagłówki?
Tony,
Pytanie uzupełniające: czy to ma znaczenie, jeśli zbudowałeś framework przy użyciu debugowania lub dystrybucji? Ponieważ inaczej Dystrybucja zajmuje mniej miejsca.
Aldrich Co,
2
@GoRoS tak, tak; w rzeczywistości wykonałem trochę pracy dla klienta, udostępniając jego prywatny SDK przy użyciu CocoaPods. Sztuczka polega na tym, aby mieć publiczne repozytorium ze skompilowaną biblioteką statyczną, nagłówkami i podspecem wskazującymi na to oraz prywatnym repozytorium ze źródłem. Idealnie byłoby, gdybyś miał jakiś rodzaj CI / automatyzacji, aby sprawdzić swoje prywatne repozytorium, skompilować i zaktualizować publiczne repozytorium, utrzymując ich synchronizację. Użyj tagów, aby oznaczyć aktualne wersjonowane wydania w repozytorium publicznym (i prawdopodobnie także w repozytorium prywatnym, aby wiedzieć, które zatwierdzenie źródła zostało użyte do utworzenia publicznego wydania).
Luke Redpath
1
@LukeRedpath Twoje rozwiązanie z CI brzmi całkiem idealnie ... czy znasz jakiś dobry artykuł / blog z samouczkiem, jak go skonfigurować? Idealnie z Jenkinsem
micromanc3r
19

zasadniczo frameworki SĄ bibliotekami i zapewniają wygodny mechanizm do pracy z nimi. Jeśli zajrzysz „do” frameworka, to jest to po prostu katalog zawierający bibliotekę statyczną i pliki nagłówkowe (w jakiejś strukturze folderów z metadanymi).

Jeśli chcesz stworzyć własny framework, musisz stworzyć „bibliotekę statyczną” i spakować ją w określony sposób. zobacz to pytanie

Ogólnie rzecz biorąc, framworks na platformach są używane do zachowania wielokrotnego użytku, w którym dodajesz własny kod „do istniejącej struktury”. jeśli chcesz mieć określoną funkcjonalność, możesz użyć biblioteki (np. three20) i spakować ją do swojej aplikacji do dystrybucji

Martin Ullrich
źródło
1
Należy pamiętać, że nie ma wymogu, aby struktura musiała zawierać bibliotekę statyczną. W rzeczywistości w systemie Mac OS X większość frameworków nie zawiera bibliotek statycznych - zamiast tego zawierają biblioteki dynamiczne.
dzięki, to jasne, ale jak mogę wywołać klasę w bibliotece statycznej z pliku .m? Czy wystarczy wywołać #import „MyClass.h” oprócz dodania „linków binarnych z bibliotekami”?
Leonardo
@Bavarious masz rację, powinienem był napisać tylko "biblioteki" ^^; nadal istnieje prawie każdy framework bez bibliotek - w większości przypadków łączysz się z frameworkiem w celu kompilacji, a biblioteka jest obecna w systemie docelowym. znowu jest to kwestia zachowania kontra funkcjonalność
Martin Ullrich,
@Leonardo tak, w zasadzie to właśnie musisz zrobić. Po prostu upewnij się, że pliki .h są gdzieś na twojej ścieżce. Jeśli masz Xcode-projekt libaray, można dołączyć do projektu i jego cel jako zależność więc masz więcej możliwości debugowania i .h-plików na swojej drodze
Martin Ullrich
Jestem zdezorientowany, myślałem, że twoja odpowiedź była poprawna, ale widziałem, że jest oznaczona jako „-1”?!?!?! Po drugie, biblioteka jest częścią obszaru roboczego i prawidłowo połączona z głównym projektem. Ale nadal otrzymuję komunikat „nie znaleziono klasy” w wierszu „#import„ MyClass.h ”” podczas tworzenia aplikacji. Wiem, że istnieje sztuczka, dzięki której to zadziała.
Leonardo