Objective-C เปรียบเทียบกับ C # อย่างไร? [ปิด]


87

ฉันเพิ่งซื้อ Mac และใช้เป็นหลักในการพัฒนา C # ภายใต้ VMWare Fusion ด้วยแอปพลิเคชัน Mac ที่ดีทั้งหมดฉันเริ่มคิดถึง Xcode ที่ซุ่มซ่อนเพียงแค่คลิกติดตั้งและเรียนรู้ Objective-C

ไวยากรณ์ระหว่างสองภาษาดูแตกต่างกันมากน่าจะเป็นเพราะ Objective-C มีต้นกำเนิดใน C และ C # มีต้นกำเนิดใน Java / C ++ แต่สามารถเรียนรู้ไวยากรณ์ที่แตกต่างกันได้ดังนั้นจึงควรใช้ได้

ข้อกังวลหลักของฉันคือการทำงานกับภาษาและหากจะช่วยในการสร้างโค้ดที่มีโครงสร้างดีอ่านง่ายและสวยงาม ฉันชอบฟีเจอร์ต่างๆเช่น LINQ และ var ใน C # และสงสัยว่ามีคุณสมบัติที่เทียบเท่าหรือดีกว่า / แตกต่างกันใน Objective-C หรือไม่

ฉันพลาดฟีเจอร์ภาษาใดที่จะพัฒนาด้วย Objective-C ฉันจะได้รับคุณสมบัติอะไรบ้าง?

แก้ไข:การเปรียบเทียบเฟรมเวิร์กมีประโยชน์และน่าสนใจ แต่การเปรียบเทียบภาษาเป็นสิ่งที่คำถามนี้ถามจริงๆ (ส่วนหนึ่งเป็นความผิดของฉันที่เริ่มแท็กด้วย.net) สันนิษฐานว่าทั้ง Cocoa และ. NET เป็นเฟรมเวิร์กที่สมบูรณ์มากในสิทธิของตัวเองและทั้งสองมีจุดประสงค์หนึ่งเป้าหมายคือ Mac OS X และ Windows อื่น ๆ

ขอบคุณสำหรับมุมมองที่คิดมาอย่างดีและมีเหตุผลที่สมดุลจนถึงตอนนี้!


27
Xcode ไม่สมบูรณ์แบบ แต่มีคุณสมบัติที่ทรงพลังและมีประโยชน์มากมาย การดูหมิ่นบางสิ่งบางอย่างว่าเป็น "ความชั่วร้ายที่บริสุทธิ์" โดยไม่ต้องสำรองข้อมูลหรือให้บริบทใด ๆ เพื่อเปรียบเทียบเป็น FUD ที่ไม่ได้ช่วยใคร ไม่ว่าในกรณีใดก็ไม่เกี่ยวข้องกับคำถาม
Quinn Taylor

11
Xcode 3.2 อาจเป็น IDE ที่ดีที่สุดที่ฉันเคยใช้มาพร้อมกับการจัดการเบรกพอยต์ที่สวยงามการวิเคราะห์แบบคงที่ข้อความแสดงข้อผิดพลาดแบบอินไลน์และคุณสมบัติอื่น ๆ อีกมากมาย Btw มันคือ "Xcode" ไม่ใช่ "XCode" @ นาธานฉันไม่เห็นจริงๆว่าทำไมคุณต้องลบล้าง Xcode โดยเรียกมันว่า "ความชั่วร้าย" - โดยไม่มีเหตุผลใด ๆ - ในการสนทนาเกี่ยวกับภาษา
Debajit

6
สิ่งสำคัญอย่างหนึ่งที่คุณจะได้รับจากการใช้ Objective-C คือคุณจะสามารถเข้าถึงกรอบงาน Cocoa ได้ นอกจากนี้ C, C #, Java และ C ++ ล้วนแบ่งปันมรดกทางวากยสัมพันธ์ Objective-C ได้รับไวยากรณ์จาก Smalltalk
Amok

4
คุณทำงาน C # โดยใช้ VMWare fusion หรือไม่ เพียงใช้ mono และ monodevelop (ซึ่งเป็น. NET และ Visual Studio รุ่นโอเพ่นซอร์สที่ทำงานบน Mac และ Linux การใช้ Mono คุณยังสามารถสร้างแอปพลิเคชัน Mac และ iPhone โดยใช้ C # ในขณะที่ใช้ไลบรารี. NET เช่นเดียวกับ Cocoa ...
Robin Heggelund Hansen

5
@ user668039 ประสบการณ์ 15 ปีใช้ C #? เปิดตัวในปี 2544!
Ian Newson

คำตอบ:


89

ไม่มีภาษาใดที่สมบูรณ์แบบสำหรับทุกงานและ Objective-C ก็ไม่มีข้อยกเว้น แต่มีความเฉพาะเจาะจงบางอย่าง เช่นเดียวกับการใช้LINQและvar(ซึ่งฉันไม่ทราบถึงการแทนที่โดยตรง) บางส่วนเกี่ยวข้องกับภาษาอย่างเคร่งครัดและอื่น ๆ เกี่ยวข้องกับเฟรมเวิร์ก

( หมายเหตุ:เช่นเดียวกับที่ C # อยู่คู่กับ. NET อย่างแน่นหนา Objective-C จะอยู่คู่กับโกโก้อย่างแน่นหนาดังนั้นบางประเด็นของฉันอาจดูเหมือนไม่เกี่ยวข้องกับ Objective-C แต่ Objective-C ที่ไม่มีโกโก้จะคล้ายกับ C # ที่ไม่มี. NET / WPF / LINQ ทำงานภายใต้ Mono ฯลฯ มันไม่ใช่วิธีที่มักจะทำ)

ฉันจะไม่แสร้งทำเป็นอธิบายความแตกต่างข้อดีและข้อเสียอย่างละเอียด แต่นี่คือบางส่วนที่ต้องนึกถึง

  • ส่วนที่ดีที่สุดอย่างหนึ่งของ Objective-C คือลักษณะไดนามิก - แทนที่จะเรียกวิธีการคุณส่งข้อความซึ่งรันไทม์กำหนดเส้นทางแบบไดนามิก เมื่อรวมกัน (อย่างรอบคอบ) กับการพิมพ์แบบไดนามิกสิ่งนี้สามารถทำให้รูปแบบที่มีประสิทธิภาพจำนวนมากง่ายขึ้นหรือใช้งานได้เล็กน้อย

  • ในฐานะตัวแทนที่เข้มงวดของ C Objective-C เชื่อมั่นว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่ แตกต่างจากวิธีการจัดการและ / หรือ typesafe ของภาษาเช่น C # และ Java Objective-C ช่วยให้คุณทำสิ่งที่คุณต้องการและสัมผัสกับผลลัพธ์ที่ตามมา เห็นได้ชัดว่าสิ่งนี้อาจเป็นอันตรายได้ในบางครั้ง แต่ความจริงที่ว่าภาษาไม่ได้ขัดขวางคุณจากการทำสิ่งต่างๆส่วนใหญ่นั้นค่อนข้างมีพลัง ( แก้ไข:ฉันควรชี้แจงว่า C # มีคุณสมบัติและฟังก์ชันการทำงานที่ "ไม่ปลอดภัย" เช่นกัน แต่พฤติกรรมเริ่มต้นคือโค้ดที่มีการจัดการซึ่งคุณต้องเลือกไม่ใช้อย่างชัดเจนโดยการเปรียบเทียบ Java อนุญาตเฉพาะโค้ด typesafe และไม่เปิดเผยตัวชี้ดิบใน แบบที่ C และคนอื่น ๆ ทำ)

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

  • Cocoa ทำให้การสร้างแอป GUI ง่ายขึ้นในหลาย ๆ ด้าน แต่คุณต้องห่อหัวของคุณรอบ ๆ กระบวนทัศน์ การออกแบบ MVC นั้นแพร่หลายใน Cocoa และรูปแบบเช่นผู้รับมอบสิทธิ์การแจ้งเตือนและแอป GUI แบบมัลติเธรดนั้นเหมาะอย่างยิ่งกับ Objective-C

  • การผูกโกโก้และการสังเกตคีย์ - ค่าสามารถกำจัดรหัสกาวจำนวนมากและกรอบงานของโกโก้ใช้ประโยชน์จากสิ่งนี้อย่างกว้างขวาง การจัดส่งแบบไดนามิกของ Objective-C ทำงานร่วมกันได้ดังนั้นประเภทของวัตถุจึงไม่สำคัญตราบใดที่เป็นไปตามคีย์ - ค่า

  • คุณอาจจะพลาดชื่อสามัญและเนมสเปซและพวกเขามีประโยชน์ แต่ในกรอบความคิดและกระบวนทัศน์ของ Objective-C พวกเขาจะเป็นสิ่งเฉพาะมากกว่าสิ่งจำเป็น (Generics เป็นข้อมูลเกี่ยวกับความปลอดภัยของประเภทและการหลีกเลี่ยงการแคสต์ แต่การพิมพ์แบบไดนามิกใน Objective-C ทำให้สิ่งนี้ไม่เป็นปัญหา Namespaces จะดีถ้าทำได้ดี แต่ก็ง่ายพอที่จะหลีกเลี่ยงความขัดแย้งที่ราคาสูงกว่าประโยชน์โดยเฉพาะ สำหรับรหัสเดิม)

  • สำหรับการทำงานพร้อมกัน Blocks (ฟีเจอร์ภาษาใหม่ใน Snow Leopard และนำไปใช้กับ Cocoa APIs) มีประโยชน์อย่างยิ่ง สองสามบรรทัด (มักใช้ร่วมกับ Grand Central Dispatch ซึ่งเป็นส่วนหนึ่งของ libsystem ในวันที่ 10.6) สามารถกำจัดส่วนประกอบสำคัญของฟังก์ชันการโทรกลับบริบท ฯลฯ (บล็อกสามารถใช้ใน C และ C ++ ได้และสามารถเพิ่มลงใน C # ได้อย่างแน่นอน ซึ่งจะยอดเยี่ยมมาก) NSOperationQueue เป็นวิธีที่สะดวกมากในการเพิ่มการทำงานพร้อมกันให้กับโค้ดของคุณเองโดยการจัดส่งคลาสย่อย NSOperation ที่กำหนดเองหรือบล็อกที่ไม่ระบุตัวตนซึ่ง GCD จะดำเนินการกับเธรดที่แตกต่างกันอย่างน้อยหนึ่งชุดให้คุณโดยอัตโนมัติ


7
ในทางเทคนิค C # มีคุณสมบัติด้านพลังงานที่ไม่ใช่ประเภทปลอดภัยทั้งหมดที่ ObjC ทำ: ตัวชี้ดิบ, เลขคณิตของตัวชี้, อาร์เรย์ที่ไม่ถูกผูกไว้, สหภาพแรงงาน, alloca. มันไม่ได้ทำให้เข้าถึงได้ง่าย - คุณต้องเลือกใช้อย่างชัดเจน
Pavel Minaev

8
ฉันพูดถึง Cocoa เพราะความน่าสนใจของการเขียนโปรแกรมใน Objective-C ส่วนใหญ่เกิดจากกรอบของ Cocoa C # จะน่าสนใจหากไม่มี. NET และ / หรือ WPF หรือไม่? ผู้ถามกล่าวถึง LINQ โดยเฉพาะดังนั้นเขาจึงมองข้ามภาษาไปยังประสบการณ์ได้อย่างชัดเจน
Quinn Taylor

7
ซึ่งก็ใช้ได้ ฉันไม่ได้พยายามที่จะทะเลาะกับ C # ถ้าฉันต้องเขียนซอฟต์แวร์ Windows นั่นคือสิ่งที่ฉันใช้ ฉันแค่พยายามชี้ให้เห็นความเหมือนและความแตกต่างระหว่างภาษาและเครื่องมือที่เกี่ยวข้อง เห็นได้ชัดว่าคุณมีประสบการณ์กับ C # มากขึ้นและฉันกับ Objective-C ขอขอบคุณสำหรับคำชี้แจงของคุณ แต่บางทีคำตอบที่สร้างสรรค์กว่าและการแยกผมน้อยจะเป็นประโยชน์ที่สุด
Quinn Taylor

11
ควินน์ไม่ใช่การแบ่งผม ฉันแค่ชี้ให้เห็นว่าสิ่งที่เริ่มต้นจากการเปรียบเทียบภาษากลายเป็นการสนทนาทั่วไปว่า Cocoa เก่งแค่ไหนในบางประเด็นในการตอบกลับของคุณ ฉันยังอยากจะชี้ให้เห็นว่าคะแนนของคุณเกี่ยวกับ Cocoa ไม่ใช่การเปรียบเทียบ - พวกเขาบอกว่า "มัน X ดี" - และมันก็อาจจะเป็นเช่นนั้น - แต่พวกเขาไม่ได้บอกว่า "มัน X ดีกว่า / แย่กว่า C # + WPF "ซึ่งเป็นสิ่งที่คำถามกว้าง ๆ
Pavel Minaev

6
+1 คำตอบที่ยอดเยี่ยม Quinn
h4xxr

54

ฉันเขียนโปรแกรมในภาษา C, C ++ และ C # มานานกว่า 20 ปีแล้วโดยเริ่มครั้งแรกในปี 1990 ฉันเพิ่งตัดสินใจดูการพัฒนา iPhone และ Xcode และ Objective-C โอ้ความดีของฉัน ... ทุกข้อร้องเรียนเกี่ยวกับ Microsoft ที่ฉันนำกลับมาตอนนี้ฉันรู้แล้วว่าโค้ดแย่แค่ไหน Objective-C ซับซ้อนกว่าเมื่อเทียบกับสิ่งที่ C # ทำ ฉันรู้สึกแย่กับ C # และตอนนี้ฉันรู้สึกซาบซึ้งกับการทำงานหนักทั้งหมดของ Microsoft เพียงแค่อ่าน Objective-C ด้วยวิธีเรียกใช้ก็ยากที่จะอ่าน C # มีความสง่างามในสิ่งนี้ นั่นเป็นเพียงความคิดเห็นของฉันฉันหวังว่าภาษาสำหรับการพัฒนาของ Apple นั้นดีพอ ๆ กับผลิตภัณฑ์ของ Apple แต่ที่รักพวกเขามีอะไรให้เรียนรู้มากมายจาก Microsoft ไม่มีคำถามแอปพลิเคชัน C # .NET ฉันสามารถดาวน์โหลดแอปพลิเคชันได้เร็วกว่า XCode Objective-C หลายเท่า Apple ควรนำใบออกจากหนังสือของ Microsoft ที่นี่แล้วเราจะมีสภาพแวดล้อมที่สมบูรณ์แบบ :-)


47
แม้ว่าคุณจะได้ดูหนังสือ dev ของ iPhone แล้วคุณยังสามารถสร้างแอปได้เร็วขึ้นบนแพลตฟอร์มที่คุณมีประสบการณ์ 20 ปี? AMAZING
kubi

25
ฉันมีประสบการณ์เดียวกันกับ Waz ฉันรู้สึกขอบคุณมากขึ้นสำหรับงานที่ Microsoft ได้ใส่ C # และเครื่องมือในการพัฒนาเช่น Visual Studio หลังจากที่ฉันได้เริ่มเรียนรู้ Objective C.
René

4
นั่นเป็นประสบการณ์ของฉันเช่นกันในขณะที่เรียน objective-c ความซับซ้อนมากเกินไปเมื่อเทียบกับ c # @ alexy13 คุณพลาดส่วนใดของ c และ c ++ จากข้อความต้นฉบับ การมีประสบการณ์หลายสิบปีในตระกูลภาษาหนึ่งช่วยให้คนจำนวนมากประเมินได้ว่าการทำงานเดียวกันกับภาษาอื่นจากตระกูลเดียวกันนั้นยากเพียงใด
Anderson Fortaleza

5
คำตอบยอดนิยมนี้เป็นอย่างไร มันไม่ใช่คำตอบที่กระชับเป็นเพียงความเห็นที่ลำเอียงอย่างชัดเจนของบางภาษาที่เขาเรียนรู้ในชั่วข้ามคืนเทียบกับภาษาที่เขาใช้มานานกว่า 20 ปี ... เห็นได้ชัดว่าคุณจะไม่เชี่ยวชาญภาษาใหม่เท่านี้
Heavy_Bullets

3
"Just reading Objective-C with method invokes is difficult to read"- นี่เป็นเพียงหนึ่งมากอัตนัยข้อโต้แย้งที่กล่าวถึงที่นี่เป็นข้อเสียของ Obj-C อื่น ๆ ทั้งหมดเป็นเพียงสำนวนที่ไม่อาจโต้แย้งได้
skywinder

46

ไม่มีการตรวจสอบทางเทคนิคที่นี่ แต่ฉันพบว่า Objective-C อ่านได้น้อยกว่ามาก จากตัวอย่างที่ Cinder6 ให้คุณ:

ค#

List<string> strings = new List<string>();
strings.Add("xyzzy");                  // takes only strings
strings.Add(15);                       // compiler error
string x = strings[0];                 // guaranteed to be a string
strings.RemoveAt(0);                   // or non-existant (yielding an exception)

วัตถุประสงค์ -C

NSMutableArray *strings = [NSMutableArray array];
[strings addObject:@"xyzzy"];
[strings addObject:@15];
NSString *x = strings[0];
[strings removeObjectAtIndex:0];

มันดูแย่มาก ฉันลองอ่านหนังสือ 2 เล่มด้วยซ้ำพวกเขาทำให้ฉันเสียตั้งแต่เนิ่นๆและโดยปกติฉันไม่เข้าใจในหนังสือ / ภาษาเกี่ยวกับการเขียนโปรแกรม

ฉันดีใจที่มี Mono สำหรับ Mac OS เพราะถ้าฉันต้องพึ่งพา Apple เพื่อให้สภาพแวดล้อมการพัฒนาที่ดี ...


17
โดยไม่สนใจความจริงที่ว่าบรรทัดที่ 1 ควรจะลงท้ายด้วย[NSMutableArray array]แทน (หน่วยความจำรั่ว) และบรรทัดที่ 4 ควรขึ้นต้นด้วยNSString* xหรือid x(คอมไพล์ผิดพลาด) ... ใช่ Objective-C ไม่มี generics (ฉันไม่พลาดตรงไปตรงมา) คุณไม่ 't สร้างดัชนีวัตถุด้วยไวยากรณ์อาร์เรย์และโดยทั่วไปแล้ว API จะมีรายละเอียดมากกว่า To-may-to, to-mah-to มันขึ้นอยู่กับสิ่งที่คุณต้องการดู (คุณสามารถเขียนรหัสเดียวกันใน C ++ STL และฉันคิดว่ามันน่าเกลียด) สำหรับฉันรหัสที่อ่านได้มักจะหมายถึงข้อความของรหัสบอกคุณว่ากำลังทำอะไรอยู่ดังนั้นจึงควรใช้รหัส Objective-C
Quinn Taylor

18
ฉันไม่พบสิ่งผิดปกติกับไวยากรณ์เช่นนี้ - สาเหตุหลักที่ทำให้รู้สึกว่าอ่านได้น้อยลงเป็นเพราะ 1) ทุกคนไม่คุ้นเคยที่มาจากพื้นหลัง C และ 2) มันถูกใช้ตรงกลางของโครงสร้าง C ธรรมดาโดยที่มัน ดูเหมือนคนต่างด้าว ในทางกลับกัน Smalltalkish ตั้งชื่อพารามิเตอร์เป็นส่วนหนึ่งของชื่อวิธีทำให้การโทรเข้าใจได้ง่ายขึ้นจากการเริ่มต้น ในความเป็นจริงตัวอย่างโค้ด C # ของคุณแสดงให้เห็นถึงสิ่งนี้ - มันจะไม่คอมไพล์เนื่องจากList<T>.Removeใช้สตริงเป็นอาร์กิวเมนต์และลบการเกิดขึ้นครั้งแรกของสตริงนั้น RemoveAtในการลบโดยดัชนีที่คุณต้องการ
Pavel Minaev

12
... ในขณะที่รุ่น ObjC พร้อมด้วยremoveObjectAtIndex:ในขณะที่มีรายละเอียดมากกว่านั้นก็ชัดเจนว่ามันทำอะไร
Pavel Minaev

6
คะแนนที่ยอดเยี่ยม Pavel นอกจากนี้ความไม่ลงรอยกันระหว่างstrings[0]และstrings.RemoveAt(0)ลดลงจากความชัดเจนอย่างน้อยสำหรับฉัน (นอกจากนี้มันมักจะทำให้ฉันสับสนเมื่อชื่อเมธอดขึ้นต้นด้วยตัวพิมพ์ใหญ่ ... ฉันรู้ว่ามันเป็นเรื่องเล็กน้อย แต่มันก็แปลกมาก)
Quinn Taylor

4
ในกรณีของฉันสำหรับหลาย ๆ คนความสามารถในการอ่าน "เครื่องมือ" มีผลต่อผลผลิตของฉัน ฉันรู้สึกสบายใจและมีประสิทธิผลกับหลายภาษา Objective-C ไม่เคยเป็นหนึ่งในนั้นและนั่นไม่ใช่เพราะขาดความพยายาม แต่ในตอนท้ายของวันทั้งหมดเป็นเรื่องของความชอบส่วนตัว ไม่เหมือนเมื่อ 20 ปีที่แล้วคุณไม่ได้ถูกบังคับให้ใช้ภาษา X เพื่อกำหนดเป้าหมายแพลตฟอร์ม Y คุณเลือกสิ่งที่เหมาะกับคุณที่สุด
TimothyP

17

การจัดการหน่วยความจำด้วยตนเองเป็นสิ่งที่ผู้เริ่มต้นใช้ Objective-C ดูเหมือนจะมีปัญหามากที่สุดส่วนใหญ่เป็นเพราะพวกเขาคิดว่ามันซับซ้อนกว่าที่เป็นอยู่

วัตถุประสงค์ -C และโกโก้โดยการขยายขึ้นอยู่กับอนุสัญญามากกว่าการบังคับใช้; รู้และปฏิบัติตามกฎเล็ก ๆ น้อย ๆ และคุณจะได้รับจำนวนมากฟรีจากเวลาทำงานแบบไดนามิกเป็นการตอบแทน

ไม่ใช่กฎที่แท้จริง 100% แต่ดีพอสำหรับทุกวันคือ:

  • ทุกสายที่เรียกallocควรจับคู่กับreleaseส่วนท้ายของขอบเขตปัจจุบัน
  • หากได้รับค่าส่งคืนสำหรับวิธีการของคุณallocแล้วควรส่งคืนโดยreturn [value autorelease];แทนที่จะจับคู่โดยrelease.
  • ใช้คุณสมบัติและไม่มีกฎข้อที่สาม

คำอธิบายที่ยาวขึ้นมีดังนี้

การจัดการหน่วยความจำขึ้นอยู่กับความเป็นเจ้าของ เฉพาะเจ้าของอินสแตนซ์อ็อบเจ็กต์เท่านั้นที่จะปล่อยอ็อบเจกต์ได้ทุกคนไม่ควรทำอะไรเลย ซึ่งหมายความว่าใน 95% ของโค้ดทั้งหมดคุณปฏิบัติกับ Objective-C ราวกับว่าเป็นขยะที่เก็บรวบรวม

แล้วอีก 5% ล่ะ? คุณมีสามวิธีในการระวังอินสแตนซ์ออบเจ็กต์ที่ได้รับจากวิธีการเหล่านี้จะเป็นของขอบเขตวิธีการปัจจุบัน:

  • alloc
  • วิธีการใด ๆ ที่เริ่มต้นด้วยคำใหม่เช่นหรือnewnewService
  • วิธีการใด ๆ ที่มีคำว่าคัดลอกเช่นและcopymutableCopy

วิธีนี้มีตัวเลือกที่เป็นไปได้สามตัวเลือกว่าจะทำอย่างไรกับอินสแตนซ์วัตถุที่เป็นเจ้าของก่อนที่จะออก:

  • ปล่อยโดยใช้releaseถ้าไม่จำเป็นอีกต่อไป
  • ให้ความเป็นเจ้าของฟิลด์(ตัวแปรอินสแตนซ์)หรือตัวแปรส่วนกลางโดยเพียงแค่กำหนด
  • เจ้าของสละ autoreleaseแต่ให้คนอื่นมีโอกาสที่จะเป็นเจ้าของก่อนเช่นไปออกไปโดยการโทร

ดังนั้นเมื่อใดที่คุณควรเป็นเจ้าของด้วยการโทรหาretain? สองกรณี:

  • เมื่อกำหนดฟิลด์ในตัวเริ่มต้นของคุณ
  • เมื่อใช้เมธอด setter ด้วยตนเอง

2
+1 สรุปยอดเยี่ยม ฟังดูคล้ายกับตอนที่ฉันเรียน C เมื่อหลายปีก่อน
Alex Angas

4
เพื่อความชัดเจนการเก็บขยะได้รับการสนับสนุนอย่างสมบูรณ์สำหรับ Objective-C บน Mac และไม่จำเป็นต้องจัดการหน่วยความจำด้วยตนเองใด ๆ การจัดการหน่วยความจำด้วยตนเองจำเป็นเฉพาะใน iOS
Debajit

3
ถึงกระนั้นคุณควรเรียนรู้พื้นฐานของการจัดการหน่วยความจำเพื่อปรับปรุงประสิทธิภาพเมื่อคุณต้องการเท่านั้น (ไม่ต้องเรียกใช้การรวบรวมขยะ)
FeifanZ

3
iOS 5 เปิดตัว ARC ทำให้ไม่จำเป็นต้องปล่อยวัตถุที่จัดสรรด้วยตนเอง แต่ก็ยังไม่มีที่ไหนง่ายเท่า C # คุณต้องจำไว้ว่า Objective-C มีอายุมากกว่า 20 ปีและยังคงรักษาข้อกำหนดบางประการของภาษาไว้ในสมัยนั้นนั่นคือการรู้ว่าเมื่อใดควรจัดสรรและเมื่อใดที่จะต้องปล่อย / ปล่อยหน่วยความจำ C # ได้ลบทั้งหมดนี้ให้คุณแล้ว ต้องบอกว่า Cocoa มี API จำนวนมากที่ยังไม่สามารถเข้าถึงได้ใน Windows Phone เช่นท่าทางการควบคุมที่มากขึ้นเมื่อพูดถึงเหตุการณ์ UI ฯลฯ ...
jyavenard

10

แน่นอนว่าถ้าทุกสิ่งที่คุณเห็นในชีวิตของคุณคือ Objective C ไวยากรณ์ของมันก็ดูเหมือนจะเป็นไปได้เท่านั้น เราสามารถเรียกคุณว่า "เวอร์จิ้นโปรแกรมมิ่ง"

แต่เนื่องจากโค้ดจำนวนมากเขียนด้วยภาษา C, C ++, Java, JavaScript, Pascal และภาษาอื่น ๆ คุณจะเห็นว่า ObjectiveC แตกต่างจากทั้งหมด แต่ไม่ใช่ในทางที่ดี พวกเขามีเหตุผลสำหรับเรื่องนี้หรือไม่? มาดูภาษายอดนิยมอื่น ๆ :

C ++ เพิ่มความพิเศษมากมายให้กับ C แต่มันเปลี่ยนไวยากรณ์ดั้งเดิมเท่าที่จำเป็นเท่านั้น

C # เพิ่มความพิเศษมากมายเมื่อเทียบกับ C ++ แต่มันเปลี่ยนเฉพาะสิ่งที่น่าเกลียดใน C ++ (เช่นการลบ "::" ออกจากอินเทอร์เฟซ)

Java เปลี่ยนแปลงหลายสิ่งหลายอย่าง แต่ยังคงไวยากรณ์ที่คุ้นเคยไว้ยกเว้นในส่วนที่จำเป็นต้องมีการเปลี่ยนแปลง

JavaScript เป็นภาษาไดนามิกที่สมบูรณ์ซึ่งสามารถทำหลายสิ่งที่ ObjectiveC ทำไม่ได้ อย่างไรก็ตามผู้สร้างไม่ได้คิดค้นวิธีการโทรแบบใหม่และส่งผ่านพารามิเตอร์เพื่อให้แตกต่างจากที่อื่น ๆ ในโลก

Visual Basic สามารถส่งผ่านพารามิเตอร์ออกไปได้เช่นเดียวกับ ObjectiveC คุณสามารถตั้งชื่อพารามิเตอร์ได้ แต่คุณสามารถส่งผ่านได้ตามปกติ ไม่ว่าคุณจะใช้อะไรก็ตามมันเป็นวิธีปกติคั่นด้วยจุลภาคที่ทุกคนเข้าใจ จุลภาคเป็นตัวคั่นตามปกติไม่ใช่เฉพาะในภาษาโปรแกรม แต่ในหนังสือหนังสือพิมพ์และภาษาเขียนโดยทั่วไป

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

Python มีไวยากรณ์ที่แตกต่างกันซึ่งง่ายต่อการอ่าน (สำหรับมนุษย์) มากกว่าภาษาปาสคาล ดังนั้นเมื่อพวกเขาเปลี่ยนมันทำให้มันแตกต่างอย่างน้อยพวกเขาก็ทำให้โปรแกรมเมอร์เราดีขึ้น

แล้วเราก็มี ObjectiveC การเพิ่มการปรับปรุงบางอย่างให้กับ C แต่การสร้างไวยากรณ์ของอินเทอร์เฟซการเรียกเมธอดการส่งผ่านพารามิเตอร์และสิ่งที่ไม่เป็นของตัวเอง ฉันสงสัยว่าทำไมพวกเขาไม่สลับ + และ - ดังนั้นการบวกลบสองจำนวน มันจะเย็นกว่านี้

สตีฟจ็อบส์ล้มเหลวโดยสนับสนุน ObjectiveC แน่นอนว่าเขาไม่สามารถรองรับ C # ซึ่งดีกว่า แต่เป็นของคู่แข่งที่แย่ที่สุดของเขา นี่คือการตัดสินใจทางการเมืองไม่ใช่การตัดสินใจในทางปฏิบัติ เทคโนโลยีได้รับผลกระทบเสมอเมื่อมีการตัดสินใจทางเทคโนโลยีด้วยเหตุผลทางการเมือง เขาควรเป็นผู้นำ บริษัท ซึ่งเขาทำได้ดีและฝากเรื่องการเขียนโปรแกรมไว้กับผู้เชี่ยวชาญตัวจริง

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


3
2 ย่อหน้าสุดท้ายสรุปทั้งหมด
Zakos

โอ้ใช่แน่ใจว่าไวยากรณ์ดูไร้สาระ แต่อัญมณีของภาษา Objective-C ก็คือมันมีการสะท้อนภาษาทั้งหมดที่ใช้ง่ายที่สุดและคุณลักษณะรันไทม์ที่ยอดเยี่ยมจริงๆซึ่งทำให้กระบวนทัศน์หลายอย่างแทบจะไม่สำคัญในการนำไปใช้ ตัวอย่างเช่นเมื่อใช้ Objective-C ฉันไม่จำเป็นต้องสนใจว่าจะใช้ตารางเชิงเส้นใด - รายการที่เชื่อมโยงหรือเวกเตอร์หรืออะไรก็ตามที่เป็นเพียงNSArrayและจัดการกับการเลือกอัลกอริทึมที่ดีที่สุดตามเครื่องจักรและลักษณะของข้อมูล
Maxthon Chan

ฉันเข้าสู่งานกำปั้นของฉันในฐานะโปรแกรมเมอร์ (บริสุทธิ์) ที่ใช้อินเทอร์เฟซผู้ใช้ iOS-App ใน Objective-C สิ่งที่ฉันต้องการในตอนนี้ (หลังจาก 3 ปี) คือการออกจาก 'เกาะ' ที่เงียบเหงาและเรียนรู้บางสิ่งที่ไม่เกี่ยวข้องกับแพลตฟอร์มและดังนั้นจึงมีความหมายมากขึ้น นอกจากนี้เพื่อเรียนรู้ว่าเฟรมเวิร์กอื่น ๆ ได้รับการอัปเดตอย่างรวดเร็วหรือไม่ - และบั๊กกี้ เฮ้! ลูกเล่นใหม่! - ความผิดพลาด ... หวังว่าศูนย์จัดหางาน (เยอรมัน) จะจ่ายเงินให้ฉันในการสอนใน Java และ / หรือ C ++ / C # เพราะฉันไม่ต้องการพัฒนาสำหรับ Apple sh * t อีกต่อไป
anneblue

5

สิ่งหนึ่งที่ฉันชอบเกี่ยวกับวัตถุประสงค์ -c คือระบบวัตถุนั้นขึ้นอยู่กับข้อความมันช่วยให้คุณทำสิ่งที่ดีจริงๆที่คุณไม่สามารถทำได้ใน C # (อย่างน้อยก็จนกว่าพวกเขาจะรองรับคีย์เวิร์ดไดนามิก!)

สิ่งที่ยอดเยี่ยมอีกอย่างเกี่ยวกับการเขียนแอปโกโก้คือตัวสร้างอินเทอร์เฟซซึ่งดีกว่าตัวออกแบบฟอร์มใน Visual Studio มาก

สิ่งที่เกี่ยวกับ obj-c ที่รบกวนฉัน (ในฐานะนักพัฒนา C #) คือความจริงที่ว่าคุณต้องจัดการหน่วยความจำของคุณเอง (มีการรวบรวมขยะ แต่ใช้ไม่ได้กับ iPhone) และอาจเป็นเรื่องที่ละเอียดมากเนื่องจาก ไวยากรณ์ตัวเลือกและ [] ทั้งหมด


2
dynamicจะทำให้คุณได้รับเพียงครึ่งเดียว - การใช้วัตถุไดนามิกที่แท้จริงแม้จะมีสิ่งเล็กน้อยเช่นการมอบหมายข้อความเป็นเรื่องที่น่าเบื่อแม้ใน C # 4.0 ในทางกลับกันราคาสำหรับข้อความไดนามิกที่แท้จริงที่มีความยืดหยุ่นที่ส่งผ่าน la ObjC จะหายไปจากประเภทความปลอดภัย
Pavel Minaev

3
เป็นสิ่งที่ควรค่าแก่การชี้ให้เห็นว่า Objective-C อนุญาตให้เลือกใช้การพิมพ์แบบคงที่ซึ่งจะให้ความปลอดภัยในการพิมพ์มากขึ้น บางคนชอบการตรวจสอบเวลาคอมไพล์บางคนชอบการตรวจสอบรันไทม์ สิ่งที่ดี (ในทั้งสองภาษา) คือตัวเลือกไม่จำเป็นต้องเป็นแบบสัมบูรณ์
Quinn Taylor

3
ตัวออกแบบ Windows Forms นั้นไม่ค่อยดีนัก แต่ถ้าคุณสามารถใช้ WPF (ณ . NET 3.0) Expression Blend ยากที่จะเอาชนะ ...
Nate

คุณสามารถทำสิ่งนี้ได้มากมายด้วยการSystem.Reflectionรวมกับส่วนขยายใน C # 3.0 คุณสามารถเรียกใช้วิธีใดก็ได้ที่คุณพบ แต่ไม่ใช่การส่งผ่านข้อความจริงดูเหมือนว่าobj.PassMessage("function_name", params object[] args);การส่งผ่านข้อความที่ดีขึ้นจะรวมเข้ากับภาษาวิธีการที่ขาดหายไปในวัตถุปกติจะเป็น จำเป็น
Filip Kunc

4

ในฐานะโปรแกรมเมอร์เพิ่งเริ่มต้นกับ Objective-C สำหรับ iPhone โดยมาจาก C # 4.0 ฉันไม่มีนิพจน์แลมบ์ดาและโดยเฉพาะ Linq-to-XML นิพจน์แลมบ์ดาคือ C # เฉพาะในขณะที่ Linq-to-XML เป็นคอนทราสต์. NET เทียบกับโกโก้ ในแอปตัวอย่างที่ฉันเขียนฉันมี XML อยู่ในสตริง ฉันต้องการแยกวิเคราะห์องค์ประกอบของ XML นั้นเป็นชุดของวัตถุ

เพื่อให้บรรลุนี้ใน Objective-C / โกโก้ผมต้องใช้ระดับ NSXmlParser คลาสนี้อาศัยอ็อบเจ็กต์อื่นซึ่งใช้NSXMLParserDelegateโปรโตคอลด้วยเมธอดที่เรียกว่า (อ่าน: ข้อความที่ส่ง) เมื่อแท็กเปิดองค์ประกอบถูกอ่านเมื่อข้อมูลบางส่วนถูกอ่าน (โดยปกติจะอยู่ภายในองค์ประกอบ) และเมื่ออ่านแท็กปิดท้ายองค์ประกอบบางส่วน . คุณต้องติดตามสถานะและสถานะการแยกวิเคราะห์ และฉันไม่รู้ว่าจะเกิดอะไรขึ้นถ้า XML ไม่ถูกต้อง มันยอดเยี่ยมสำหรับการลงรายละเอียดและเพิ่มประสิทธิภาพ แต่โอ้มนุษย์นี่เป็นโค้ดมากมาย

ในทางตรงกันข้ามนี่คือรหัสใน C #:

using System.Linq.Xml;
XDocument doc = XDocument.Load(xmlString);
IEnumerable<MyCustomObject> objects = doc.Descendants().Select(
         d => new MyCustomObject{ Name = d.Value});

เพียงเท่านี้คุณก็มีชุดของวัตถุแบบกำหนดเองที่ดึงมาจาก XML หากคุณต้องการกรององค์ประกอบเหล่านั้นตามค่าหรือเฉพาะองค์ประกอบที่มีแอตทริบิวต์เฉพาะหรือหากคุณต้องการเพียง 5 รายการแรกหรือข้าม 1 รายการแรกและรับ 3 รายการถัดไปหรือเพียงตรวจสอบว่ามีการส่งคืนองค์ประกอบใด ... แบมอยู่ในบรรทัดเดียวกันของรหัส

มีคลาสโอเพนซอร์สจำนวนมากที่ทำให้การประมวลผลนี้ง่ายขึ้นมากใน Objective-C ดังนั้นจึงช่วยเพิ่มการใช้งานได้มาก มันไม่ใช่แค่นี้ในตัว

* หมายเหตุ: ฉันไม่ได้รวบรวมโค้ดด้านบนจริงๆมันมีไว้เพื่อเป็นตัวอย่างเพื่อแสดงให้เห็นถึงการขาดความละเอียดถี่ถ้วนที่ C # ต้องการ


สิ่งสำคัญที่ไม่ควรทำที่นี่คือไม่มี "การใช้คำฟุ่มเฟือย" ในส่วนของ C # มากนักในการเปรียบเทียบนี้มีเพียงความฟุ่มเฟื่อยที่มีอยู่ในคลาส. net framework ที่คุณใช้เพื่อแยกวิเคราะห์ XML ของคุณ หากคุณตรวจสอบโค้ดในโค้ดเหล่านั้นคุณจะพบโค้ด C # ที่ดีมากขึ้นซึ่งอาจจะละเอียดกว่าด้วยซ้ำ
XIVSolutions

3

ความแตกต่างที่สำคัญที่สุดคือการจัดการหน่วยความจำ ด้วย C # คุณจะได้รับการเก็บขยะโดยอาศัยภาษาที่ใช้ CLR ด้วย Objective-C คุณต้องจัดการหน่วยความจำด้วยตัวเอง

หากคุณมาจากพื้นหลัง C # (หรือภาษาสมัยใหม่สำหรับเรื่องนั้น ๆ ) การย้ายไปยังภาษาที่ไม่มีการจัดการหน่วยความจำอัตโนมัติจะเป็นเรื่องที่เจ็บปวดมากเนื่องจากคุณจะใช้เวลาในการเขียนโค้ดเป็นจำนวนมากในการจัดการหน่วยความจำอย่างถูกต้อง (และการดีบักเป็น ดี).


6
ObjC ได้ติดตามการเก็บขยะในปัจจุบัน ในทางกลับกัน C # ช่วยให้คุณจัดการหน่วยความจำได้ด้วยตัวเองหากคุณต้องการ (ขอบคุณตัวชี้ดิบ)
Pavel Minaev

3
ฉันไม่พบว่าการจัดการหน่วยความจำแบบแมนนวลใน Objective-C (ในบริบทของเฟรมเวิร์กของ Apple) จะเป็นภาระมากนัก: วงจรการเก็บ / รีลีส / การปล่อยอัตโนมัตินั้นยุ่งยากน้อยกว่าการจัดการหน่วยความจำ "แบบเดิม" ใน C และ C ++ มาก
mipadi

5
นี่ไม่ใช่ DSO ที่แท้จริง - แม้ว่าจะอยู่ในสภาพแวดล้อมที่ไม่ใช่การเก็บขยะเช่น iPhone ก็ตามสิ่งที่เก็บ / ปล่อยและปล่อยอัตโนมัติจะใช้เวลาประมาณ 10 นาทีในการเรียนรู้จากนั้นก็ไม่มีปัญหา ฉันพบ C # -ers จำนวนมากที่ชอบพูดเกินจริงถึงความท้าทายในการจัดการหน่วยความจำ เกือบจะเหมือนกับว่าพวกเขากลัวว่าพวกเขาจะเริ่มชอบ obj-c มากเกินไปเป็นอย่างอื่น ... ;)
h4xxr

4
พื้นฐานของการจัดการหน่วยความจำด้วยตนเองไม่ใช่เรื่องยาก แต่อาจทำให้เกิดความซับซ้อนได้อย่างรวดเร็วเมื่อคุณเริ่มส่งผ่านวัตถุที่จัดสรรไปรอบ ๆ และจำเป็นต้องจัดการกับกราฟวัตถุที่ซับซ้อนเนื่องจากคุณต้องปฏิบัติตามกฎอย่างรอบคอบว่าใครเป็นผู้รับผิดชอบในการพ้นและเมื่อใด การใช้การนับอ้างอิงทำให้ง่ายขึ้นเล็กน้อยยกเว้นว่าคุณต้องจัดการกับวัฏจักรในกราฟออบเจ็กต์ ... เมื่อเทียบกับ C # IMO ทั้งหมดนี้มีความแตกต่างอย่างมาก
DSO

1

นี่เป็นบทความที่ค่อนข้างดีในการเปรียบเทียบสองภาษา: http://www.coderetard.com/2008/03/16/c-vs-objective-c/


เป็นที่น่าเสียดายที่หน้าอ้างว่าเป็น UTF-8 แต่มีการแทนที่ที่น่ารังเกียจทุกประเภทสำหรับเครื่องหมายอะพอสทรอฟีและเครื่องหมายคำพูด ฉันคิดว่าข้อความของเขาใช้เครื่องหมายคำพูด "โค้ง" แต่พวกเขาเข้าใจรหัสอย่างเข้าใจยาก ...
Quinn Taylor

ดูเหมือนว่าพวกเขาจะขโมยหมูอินโทรของพวกเขาไปทั้งตัว แต่แม้แต่แหล่งที่มาของบทความก็ยังมีรหัสของพวกเขาอยู่ ไม่ใช่บทความที่ยอดเยี่ยมเป็นพิเศษ
dnord

-2

นอกเหนือจากความแตกต่างของกระบวนทัศน์ระหว่าง 2 ภาษาแล้วก็ไม่มีความแตกต่างกันมากนัก เท่าที่ฉันเกลียดที่จะพูดคุณสามารถทำสิ่งเดียวกัน (อาจไม่ใช่เรื่องง่าย) ด้วย. NET และ C # เท่าที่จะทำได้ด้วย Objective-C และ Cocoa สำหรับ Leopard นั้น Objective-C 2.0 มีการรวบรวมขยะดังนั้นคุณจึงไม่จำเป็นต้องจัดการหน่วยความจำด้วยตัวเองเว้นแต่คุณต้องการ (ความเข้ากันได้ของรหัสกับ Mac และแอพ iPhone รุ่นเก่ามี 2 เหตุผลที่คุณต้องการ)

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

ฉันจะเป็นคนแรกที่ยอมรับว่าฉันไม่ค่อยคุ้นเคยกับ C # หรือ. NET แต่เหตุผลที่ Quinn ระบุไว้ข้างต้นเป็นเหตุผลบางประการที่ฉันไม่สนใจที่จะเป็นเช่นนั้น


-3

การเรียกเมธอดที่ใช้ใน obj-c make เพื่อให้อ่านโค้ดได้ง่ายในความคิดของฉันดูหรูหรากว่า c # มากและ obj-c สร้างขึ้นที่ด้านบนของ c ดังนั้นรหัส c ทั้งหมดควรทำงานได้ดีใน obj-c ผู้ขายรายใหญ่สำหรับฉันคือ obj-c เป็นมาตรฐานเปิดดังนั้นคุณสามารถค้นหาคอมไพเลอร์สำหรับระบบใดก็ได้


2
ISO C # ยังเป็นมาตรฐานเปิด เท่าที่ฉันรู้คอมไพเลอร์ ObjC เดียวที่มีอยู่คือ gcc
Pavel Minaev

@Pavel: นอกจากนี้ยังมี Portable Object Compiler ( users.telenet.be/stes/compiler.html ) และ clang
mipadi

1
ที่จริงแล้ว GCC ไม่ใช่คอมไพเลอร์เพียงอย่างเดียวอีกต่อไป - Clang และ LLVM เป็นเทคโนโลยีที่ออกแบบและพัฒนาขึ้นเพื่อแทนที่ GCC และทำในสิ่งที่ไม่เคยทำได้รวมถึงการรวบรวม JIT นี่คือหัวใจหลักของ OpenCL ใน Snow Leopard นอกจากนี้ยังสามารถขยายไปยังภาษาอื่น ๆ ได้และคุ้มค่าที่จะลองดู
Quinn Taylor

2
ฉันไม่คิดว่าการพกพาเป็นมืออาชีพของ Objective-C โดยสุจริต แต่จุดแข็งนั้นมีมากขึ้นตามแนวการพัฒนาที่รวดเร็วและลดปริมาณโค้ดเพื่อให้งานเดียวกันสำเร็จ
Quinn Taylor

ขอบคุณสำหรับการแก้ไขข้อผิดพลาดของฉันเกี่ยวกับความพร้อมใช้งานของคอมไพเลอร์ ในทางเทคนิคแล้วความสามารถในการพกพาก็มีอยู่เช่นกัน - ฉันสามารถใช้ MinGW / ObjC บน Win32 ได้ดีเช่นในแง่นั้นมันพกพาได้พอ ๆ กับ gcc เอง แน่นอนว่าห้องสมุดจะไม่อยู่ที่นั่น (แม้ว่า ... จะมี GnuStep / Win32 หรือไม่) แต่สถานการณ์นี้ไม่ได้แย่ไปกว่าที่เรามีกับ Mono โดยรวมแล้วฉันจะบอกว่าการพกพาไม่ใช่จุดแข็งสำหรับทั้งสองฝ่าย
Pavel Minaev
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.