ความแตกต่างระหว่าง Framework และไลบรารีแบบคงที่ใน xcode4 และวิธีการเรียกใช้


134

ฉันค่อนข้างใหม่กับ xcode และ objective-c ฉันต้องการถามคำถามพื้นฐาน

ฉันเห็นว่าเมื่อ "เชื่อมโยงไบนารีกับไลบรารี" ในการตั้งค่าโครงการมีความแตกต่างเกี่ยวกับกรอบงานและไลบรารีซึ่งนำเข้าจากโครงการอื่นในพื้นที่ทำงาน

คำถามแรกทำไมต้องมีกรอบ? แล้วทำไมต้องมีห้องสมุด? ห้องสมุดของฉันไม่สามารถเป็นกรอบงานได้หรือไม่?

แล้วจากไฟล์. hฉันจะเรียกคลาสจากไลบรารีสแตติกที่นำเข้าได้อย่างไร

ฉันคิดว่าต้องมีคำนำหน้า แต่ฉันหาไม่เจอ "ProjName / Myclass.h" ไม่ทำงาน

โปรดระบุให้ชัดเจนที่สุดเท่าที่จะทำได้

ขอบคุณ


ไม่ใช่คำถามพื้นฐาน
Masih

คำตอบ:


141

ข้อได้เปรียบที่ใหญ่ที่สุดที่เฟรมเวิร์กมีเหนือไลบรารีแบบคงที่คือพวกมันทำหน้าที่เป็นวิธีการบรรจุไบนารีของไลบรารีที่คอมไพล์และส่วนหัวที่เกี่ยวข้องอย่างเป็นระเบียบ สามารถทิ้งลงในโปรเจ็กต์ของคุณได้ (เช่นเดียวกับเฟรมเวิร์กในตัวของ SDK เช่น Foundation และ UIKit) และควรใช้งานได้จริง (เกือบตลอดเวลา)

เฟรมเวิร์กส่วนใหญ่มีไลบรารีแบบไดนามิก เฟรมเวิร์กที่สร้างใน Xcode โดยใช้เทมเพลต Mac Framework จะสร้างไลบรารีแบบไดนามิก iPhone ไม่รองรับเฟรมเวิร์กแบบไดนามิกซึ่งเป็นสาเหตุที่ทำให้ไลบรารีโค้ด iOS ที่ใช้ซ้ำได้กลายเป็นไลบรารีแบบคงที่แทน

ไลบรารีแบบคงที่เป็นสิ่งที่ดี แต่พวกเขาต้องการการทำงานเพิ่มเติมเล็กน้อยในส่วนของผู้ใช้ คุณต้องเชื่อมโยงโปรเจ็กต์ของคุณกับไลบรารีและคุณต้องคัดลอกไฟล์ส่วนหัวลงในโปรเจ็กต์ของคุณหรืออ้างอิงจากที่ใดที่หนึ่งโดยตั้งค่าพา ธ การค้นหาส่วนหัวที่เหมาะสมในการตั้งค่าบิลด์ของคุณ

ดังนั้น: โดยสรุปแล้วความเห็นของฉันก็คือวิธีที่ดีที่สุดในการกระจายห้องสมุดของคุณคือกรอบ ในการสร้างเฟรมเวิร์ก "คงที่" สำหรับ iOS คุณสามารถใช้เฟรมเวิร์กปกติและแทนที่ไบนารีด้วยไลบรารีคงที่ที่คอมไพล์ของคุณได้ นี่คือวิธีที่ฉันแจกจ่ายไลบรารีRestyและเป็นวิธีที่ฉันตั้งใจจะแจกจ่ายห้องสมุดของฉันในอนาคต

คุณอาจต้องการดู Rakefile ที่ให้มาในโปรเจ็กต์นั้น (ในกรณีที่คุณไม่ทราบว่า Rake เทียบเท่ากับ Make ของ Ruby) ฉันมีงานจำนวนหนึ่งสำหรับการรวบรวมโปรเจ็กต์ของฉัน (โดยใช้xcodebuild) และบรรจุเป็นเฟรมเวิร์กแบบคงที่สำหรับ iOS คุณควรพบว่าสิ่งนี้มีประโยชน์

หรือคุณอาจต้องการใช้เทมเพลต Xcode 4 เหล่านี้เพื่อสร้างกรอบงาน iOS

อัปเดต 9 ธันวาคม 2556 : นี่เป็นคำตอบยอดนิยมดังนั้นฉันคิดว่าฉันจะแก้ไขเพื่อบอกว่าตัวเลือกแรกสำหรับการแจกจ่ายห้องสมุดมีการเปลี่ยนแปลง ตัวเลือกแรกของฉันสำหรับไลบรารีของบุคคลที่สามในฐานะผู้บริโภคหรือผู้ผลิตคือ CocoaPods ฉันแจกจ่ายไลบรารีของฉันโดยใช้ CocoaPods และเสนอไลบรารีแบบคงที่ที่คอมไพล์ไว้ล่วงหน้าพร้อมส่วนหัวเป็นตัวเลือกสำรอง


1
ดังนั้นไลบรารีจึงสามารถเป็นแบบคงที่และแบบไดนามิกและเฟรมเวิร์กเป็นเพียงกลุ่มของไลบรารีซึ่งอาจเป็นแบบไดนามิกหรือแบบคงที่นั่นคือความเข้าใจที่ถูกต้องหรือไม่?
Tony

ดูเหมือนว่าเป้าหมายเฟรมเวิร์ก Xcode ยังอนุญาตให้คุณคัดลอกส่วนหัว แต่ไม่รวมทรัพยากร ไลบรารีแบบคงที่กระจายสามารถมีส่วนหัวได้หรือไม่
Tony

คำถามติดตาม: มันสำคัญหรือไม่ถ้าคุณสร้างกรอบโดยใช้การดีบักหรือการแจกจ่าย? เนื่องจากมิฉะนั้นการกระจายจะมีขนาดเล็กลง
Aldrich Co

2
@GoRoS ใช่ฉันทำ; อันที่จริงฉันเพิ่งทำงานให้กับลูกค้าทำให้ SDK ส่วนตัวพร้อมใช้งานโดยใช้ CocoaPods เคล็ดลับคือการมี repo สาธารณะที่มีไลบรารีคงที่คอมไพล์ส่วนหัวและ podspec ชี้ไปที่สิ่งนี้และ repo ส่วนตัวพร้อมแหล่งที่มาของคุณ ตามหลักการแล้วคุณจะมี CI / ระบบอัตโนมัติบางประเภทเพื่อตรวจสอบ repo ส่วนตัวของคุณรวบรวมและอัปเดต repo สาธารณะของคุณทำให้ทั้งสองตรงกัน ใช้แท็กเพื่อแท็กรุ่นที่เป็นเวอร์ชันจริงใน repo สาธารณะ (และอาจอยู่ใน repo ส่วนตัวด้วยเพื่อให้คุณทราบว่าแหล่งที่มาที่ใช้คอมมิตใดที่ใช้ในการสร้างรุ่นสาธารณะ)
Luke Redpath

1
@LukeRedpath โซลูชันของคุณด้วย CI ฟังดูดีทีเดียว ... คุณรู้เกี่ยวกับบทความ / บล็อกที่ดีพร้อมบทช่วยสอนวิธีการตั้งค่าหรือไม่? เหมาะอย่างยิ่งกับ Jenkins
micromanc3r

19

โดยพื้นฐานแล้วเฟรมเวิร์กคือไลบรารีและมีกลไกที่มีประโยชน์สำหรับการทำงานกับพวกเขา หากคุณดู "ภายใน" กรอบงานเป็นเพียงไดเร็กทอรีที่มีไลบรารีแบบคงที่และไฟล์ส่วนหัว (ในโครงสร้างโฟลเดอร์บางส่วนที่มีข้อมูลเมตา)

หากคุณต้องการสร้างเฟรมเวิร์กของคุณเองคุณต้องสร้าง "ไลบรารีแบบคงที่" และบรรจุด้วยวิธีที่เฉพาะเจาะจง ดูคำถามนี้

โดยทั่วไปแล้ว framworks บนแพลตฟอร์มจะใช้สำหรับพฤติกรรมที่ใช้ซ้ำได้โดยที่คุณเพิ่มโค้ดของคุณเอง "ลงในเฟรมเวิร์กที่มีอยู่" หากคุณต้องการมีฟังก์ชันเฉพาะบางอย่างคุณอาจต้องการใช้ไลบรารี (เช่น three20) และบรรจุลงในแอปของคุณที่แจกจ่ายได้


1
โปรดทราบว่าไม่มีข้อกำหนดว่ากรอบงานต้องมีไลบรารีแบบคงที่ ในความเป็นจริงบน Mac OS X เฟรมเวิร์กส่วนใหญ่ไม่มีไลบรารีแบบคงที่ แต่จะมีไลบรารีแบบไดนามิกแทน

ขอบคุณที่ชัดเจน แต่ฉันจะเรียกคลาสในไลบรารีแบบคงที่จากภายในไฟล์. m ได้อย่างไร เพียงพอหรือไม่ที่จะเรียก #import "MyClass.h" นอกเหนือจากการเพิ่ม "link binaries with libraries"
Leonardo

@Bavarious คุณพูดถูกฉันควรจะเขียน "ห้องสมุด" เท่านั้น ^^; ยังคงมีเกือบทุกเฟรมเวิร์กที่ไม่มีไลบรารี - ในกรณีส่วนใหญ่คุณจะเชื่อมโยงกับเฟรมเวิร์กสำหรับการคอมไพล์และไลบรารีอยู่ในระบบเป้าหมาย นี่คือสิ่งที่เป็นพฤติกรรมเทียบกับการทำงานอีกครั้ง
Martin Ullrich

@ Leonardo ใช่โดยพื้นฐานแล้วนั่นคือสิ่งที่คุณต้องทำ ตรวจสอบให้แน่ใจว่าไฟล์. h อยู่ในเส้นทางของคุณ หากคุณมีโครงการ XCode ของ libaray คุณสามารถรวมโปรเจ็กต์และเป้าหมายเป็นการอ้างอิงเพื่อให้คุณได้รับคุณสมบัติการดีบักเพิ่มเติมและไฟล์. h ในเส้นทางของคุณ
Martin Ullrich

ฉันงงฉันคิดว่าคำตอบของคุณถูกต้อง แต่ฉันเห็นว่ามีเครื่องหมาย "-1"?!?!?! ประการที่สองไลบรารีเป็นส่วนหนึ่งของพื้นที่ทำงานและเชื่อมโยงอย่างถูกต้องจากโครงการหลัก แต่ฉันยังได้รับ "ไม่พบคลาส" ที่บรรทัด '#import "MyClass.h"' เมื่อสร้างแอปพลิเคชัน ฉันรู้ว่ามีเคล็ดลับในการทำให้มันใช้งานได้
Leonardo
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.