Maqsad-C - Objective-C

Maqsad-C
OilaC
LoyihalashtirilganTom Love va Bred Koks
Birinchi paydo bo'ldi1984; 36 yil oldin (1984)
Barqaror chiqish
2.0[1]
Matnni yozishstatik, dinamik, zaif
OSO'zaro faoliyat platforma
Fayl nomi kengaytmalari.h, .m, .mm, .M
Veb-saytdeveloper.apple.com
Mayor amalga oshirish
Jiringlash, GCC
Ta'sirlangan
C, Kichik munozarasi
Ta'sirlangan
Groovy, Java, Yo'q, Maqsad-J, Tom, Tez[2]

Maqsad-C a umumiy maqsad, ob'ektga yo'naltirilgan dasturlash tili qo'shadi Kichik munozarasi - uslub xabar almashish uchun C dasturlash tili. Bu tomonidan qo'llab-quvvatlanadigan asosiy dasturlash tili edi olma uchun macOS, iOS va ularga tegishli amaliy dasturlash interfeyslari (API), Kakao va Kakao teginish, joriy etilgunga qadar Tez 2014 yilda.[3]

Til dastlab 1980-yillarning boshlarida ishlab chiqilgan. Keyinchalik foydalaniladigan asosiy til sifatida tanlangan Keyingisi uning uchun Keyingi qadam operatsion tizim, undan macOS va iOS olingan.[4] Apple kutubxonalarini ishlatmaydigan yoki boshqa tizimlar uchun ko'chirilishi yoki bajarilishi mumkin bo'lgan qismlardan foydalanadigan Portativ Objective-C dasturlari, shuningdek, qo'llab-quvvatlaydigan har qanday tizim uchun tuzilishi mumkin. GNU kompilyatori to'plami (GCC) yoki Jiringlash.

Objective-C manba kodini "amalga oshirish" dastur fayllari odatda mavjud .m Fayl nomi kengaytmalari, Objective-C "header / interfeysi" fayllari mavjud .h kengaytmalar, xuddi shunday C sarlavha fayllari. Objective-C ++ fayllari a bilan belgilanadi .mm fayl kengaytmasi.

Tarix

Ob'ektiv-C asosan tomonidan yaratilgan Bred Koks va 1980-yillarning boshlarida Tom Love o'z kompaniyalarida Mahsuldorlik mahsulotlari Xalqaro.[5]

O'zlarining kompaniyalarini yaratishga qadar ikkalasi ham tanishtirilgan Kichik munozarasi esa ITT korporatsiyasi Dasturlash texnologiyalari markazi 1981 yilda. Maqsad-C bo'yicha eng dastlabki ish shu davrga tegishli.[6] Koksni haqiqiy qayta ishlatish muammolari qiziqtirgan dasturiy ta'minot dizayni va dasturlash. Smalltalk singari til ITT tizimida ishlab chiquvchilar uchun rivojlanish muhitini yaratishda bebaho bo'lishini tushundi. Shu bilan birga, u va Tom Love shuningdek, C bilan orqaga qarab muvofiqligi ITT telekommunikatsiya muhiti uchun juda muhim ahamiyatga ega ekanligini tan olishdi.[7]

Koks oldindan protsessor yozishni boshladi C Smalltalkning ba'zi qobiliyatlarini qo'shish. Tez orada u ob'ektga yo'naltirilgan kengaytmani ishlaydigan tarzda amalga oshirdi C Ob'ektga yo'naltirilgan oldindan kompilyator uchun "OOPC" deb nomlagan til.[8]Sevgi 1982 yilda Schlumberger Research tomonidan yollangan va Smalltalk-80 ning birinchi tijorat nusxasini sotib olish imkoniyatiga ega bo'lgan, bu ularning aqliy ishlarining rivojlanishiga yanada ta'sir ko'rsatgan. Haqiqiy taraqqiyotga erishish mumkinligini namoyish etish uchun Koks bir-birining o'rnini bosishini ko'rsatdi dasturiy ta'minot komponentlari haqiqatan ham mavjud vositalarga bir nechta amaliy o'zgarishlar kerak edi. Xususan, ular moslamalarni moslashuvchan tarzda qo'llab-quvvatlashi, kutubxonalar to'plami bilan ta'minlanishi va kodni (va kod uchun zarur bo'lgan barcha manbalarni) bitta platformalararo formatga to'plashiga imkon berishlari kerak edi.

Sevgi va Koks oxir-oqibat o'z mahsulotlarini tijoratlashtirish uchun PPI shakllantirdilar, bu esa Objective-C kompilyatorini sinf kutubxonalari bilan birlashtirdi. 1986 yilda Koks ob'ektiv-C ning asosiy tavsifini kitobda asl nusxasida nashr etdi Ob'ektga yo'naltirilgan dasturlash, evolyutsion yondashuv. U takroriy foydalanish muammosida "Objective-C" taqdim etganidan tashqari ko'proq narsa borligini ta'kidlashda ehtiyotkorlik bilan harakat qilgan bo'lsa-da, til ko'pincha o'ziga xos xususiyatni boshqa tillar bilan taqqoslaganda o'zini topdi.

NeXT orqali ommalashtirish

1988 yilda, Keyingisi litsenziyaga ega bo'lgan StepStone-dan Objective-C (PPI-ning yangi nomi, Objective-C savdo belgisining egasi) va kengaytirilgan GCC Objective-C-ni qo'llab-quvvatlash uchun kompilyator. NeXT ishlab chiqardi AppKit va Poydevor to'plami qaysi kutubxonalar Keyingi qadam foydalanuvchi interfeysi va interfeys yaratuvchisi asoslangan edi. NeXT ish stantsiyalari bozorda katta ta'sir o'tkaza olmagan bo'lsa-da, asboblar sohada keng maqtovga sazovor bo'ldi. Bu NeXT-ni apparat ishlab chiqarishni to'xtatib, dasturiy vositalarga e'tiborini qaratishga va NeXTSTEP (va OpenStep) dasturlarini maxsus dasturlash uchun platforma sifatida sotishga olib keldi.

Shartlarini chetlab o'tish uchun GPL, NeXT dastlab Objective-C frontend-ni alohida jo'natishni niyat qilgan edi, bu esa foydalanuvchiga kompilyatorning bajarilishi uchun uni GCC bilan bog'lashiga imkon berdi. Dastlab qabul qilinganidan keyin Richard M. Stallman, Stallman GNU advokatlari bilan maslahatlashgandan so'ng va NeXT ob'ektiv-Sni GCC tarkibiga kiritishga rozilik berganidan keyin ushbu reja rad etildi.[9]

Ishni kengaytirish GCC Stiv Naroff tomonidan boshqarilgan bo'lib, u NeXT-ga StepStone-dan qo'shilgan. Tuzuvchiga o'zgartirishlar kiritildi GPL litsenziya shartlari, ammo ish vaqti kutubxonalari bunday bo'lmagan, bu ochiq manbali ulushni keng ommaga yaroqsiz holga keltirgan. Bu boshqa tomonlarning bunday ish vaqti kutubxonalarini ochiq manba litsenziyasi ostida ishlab chiqishiga olib keldi. Keyinchalik, Stiv Naroff, shuningdek, Apple-da Objective-C frontendini yaratish uchun ishlashda asosiy hissa qo'shgan Jiringlash.

The GNU Loyiha bepul dasturiy ta'minotni amalga oshirish bo'yicha ish boshladi Kakao, nomi berilgan GNUstep, asosida OpenStep standart.[10] Dennis Glatting birinchi GNU Objective-C-ni yozgan ish vaqti 1993 yilda ishlatilgan GNU Objective-C ish vaqti, Kresten Krab Thorup tomonidan universitet talabasi bo'lganida ishlab chiqilgan. Daniya.[iqtibos kerak ] Shuningdek, Torup NeXT-da 1993 yildan 1996 yilgacha ishlagan.[11]

Apple rivojlanishi va Swift

1996 yilda NeXT sotib olgandan so'ng, Apple Computer o'sha paytdagi yangi operatsion tizimida OpenStep-dan foydalangan, Mac OS X. Bunga Objective-C, NeXT ning Objective-C-ga asoslangan ishlab chiquvchi vositasi, Loyiha quruvchisi va uning interfeysi dizayni vositasi, Interface Builder, ikkalasi endi bitta dasturga birlashtirildi, Xkod. Apple kompaniyasining aksariyat qismi Kakao API OpenStep interfeysi ob'ektlariga asoslangan va faol rivojlanish uchun ishlatiladigan eng muhim Objective-C muhiti.

Da WWDC 2014 yil, Apple yangi tilni taqdim etdi, Tez, "S-ob'ektivsiz-C" sifatida tavsiflangan.

Sintaksis

Ob'ektiv-C tepada joylashgan ingichka qatlamdir C va "qattiq" superset "ning C, ya'ni har qanday C dasturini Objective-C kompilyatori bilan kompilyatsiya qilish va Objective-C sinfiga C til kodini erkin kiritish mumkin degan ma'noni anglatadi.[12][13][14][15][16][17]

Objective-C o'z ob'ektiv sintaksisini quyidagidan oladi Kichik munozarasi. Ob'ektga yo'naltirilmagan operatsiyalar uchun barcha sintaksis (ibtidoiy o'zgaruvchilar, oldindan ishlov berish, iboralar, funktsiyalar deklaratsiyalari va funktsiyalarni chaqirish kabi) C bilan bir xil, ob'ektga yo'naltirilgan xususiyatlar uchun sintaksis esa Smalltalk- uslubiy xabarlar.

Xabarlar

Ob'ektga yo'naltirilgan dasturlashning Ob'ektiv-S modeli asoslanadi xabar o'tmoqda misollarga qarshi chiqish. Maqsad-C-da bunday qilmaydi usulni chaqirish; bitta xabar yuboradi. Bu o'xshamaydi Simula tomonidan ishlatiladigan uslubiy dasturlash modeli C ++. Ushbu ikkita tushunchaning farqi usul yoki xabar nomi bilan havola qilingan kod qanday bajarilishida. Simula uslubidagi tilda usul nomi ko'p hollarda bo'ladi bog'langan kompilyator tomonidan maqsad sinfidagi kod qismiga. Yilda Kichik munozarasi va Objective-C, xabarning maqsadi ish vaqtida hal qilinadi, qabul qiluvchi ob'ekt o'zi xabarni sharhlaydi. Bir usul a tomonidan aniqlanadi selektor yoki SEL - har bir xabar nomi uchun noyob identifikator, ko'pincha shunchaki a NULL- tugatilgan mag'lubiyat uning nomini ifodalaydi va C usuli bilan hal qilindi ko'rsatgich uni amalga oshirish: an IMP.[18] Buning natijasi shundaki, xabarlarni uzatish tizimida hech qanday tekshiruv yo'q. Xabar yo'naltirilgan ob'ekt - the qabul qiluvchi - xabarga javob berishga kafolat berilmaydi va agar javob bermasa, bu istisnoga olib keladi.[19]

Xabar yuborilmoqda usul ko'rsatgich tomonidan ko'rsatilgan ob'ektga obj quyidagi kodni talab qiladi C ++:

obj->usul(dalil);

Objective-C-da bu quyidagicha yozilgan:

[obj usul:dalil];

"Metod" chaqiruvi kompilyator tomonidan objc_msgSend (id self, SEL op, ...) ish vaqti funktsiyalari oilasi. Turli xil dasturlar zamonaviy qo'shimchalar kabi ishlaydi super.[20] GNU oilalarida ushbu funktsiya nomlangan objc_msg_sendv, lekin u zamonaviy qidiruv tizimining foydasiga eskirgan objc_msg_lookup.[21]

Dasturlashning har ikkala uslubi ham kuchli va kuchsiz tomonlariga ega. Simulada ob'ektga yo'naltirilgan dasturlash (C ++ ) uslubi imkon beradi ko'p meros yordamida tezroq bajarish kompilyatsiya vaqtini bog'lash iloji boricha, lekin u qo'llab-quvvatlamaydi dinamik majburiy avvalboshdan. Shuningdek, u barcha usullarni, agar ular bo'lmasa tegishli ravishda amalga oshirishga majbur qiladi mavhum. Objective-C-da ishlatilgan Smalltalk uslubidagi dasturlash, xabarlarning bajarilmasligiga imkon beradi va bu usul ish vaqtida amalga oshiriladi. Masalan, ob'ektlar to'plamiga xabar yuborilishi mumkin, ularga faqat ba'zilari javob berishi kutiladi, ish vaqti xatolaridan qo'rqmasdan. Xabarni yuborish, shuningdek, ob'ektni kompilyatsiya vaqtida aniqlashni talab qilmaydi. Amalga oshiriladigan ob'ektda usulni chaqirish uchun hali ham talab qilinadi. (Qarang dinamik yozish Dinamik (kech) bog'lashning ko'proq afzalliklari uchun quyidagi bo'lim.)

Interfeyslar va dasturlar

Objective-C sinf interfeysi va bajarilishi alohida e'lon qilingan kod bloklarida bo'lishini talab qiladi. An'anaga ko'ra, ishlab chiquvchilar interfeysni sarlavha fayli va kod faylida amalga oshirish. Odatda .h qo'shimchasi qo'shilgan sarlavha fayllari C sarlavhali fayllarga o'xshaydi, odatda .m qo'shimchali dastur (usul) fayllari C kod fayllariga juda o'xshash bo'lishi mumkin.

Interfeys

Bu C ++ yoki Python kabi boshqa ob'ektga yo'naltirilgan tillarda ishlatilgan sinf deklaratsiyasiga o'xshashdir.

Sinf interfeysi odatda sarlavha faylida aniqlanadi. Umumiy konventsiya - bu nom nomidan sarlavha faylini nomlash, masalan. Ball.h sinf uchun interfeysni o'z ichiga oladi To'p.

Interfeys deklaratsiyasi quyidagi shaklga ega:

@ interfeys sinf nomi : superklassname {  // misol o'zgaruvchilari}+ classMethod1;+ (return_type)classMethod2;+ (return_type)classMethod3:(param1_type)param1_varName;- (return_type)instanceMethod1With1Parameter:(param1_type)param1_varName;- (return_type)instanceMethod2With2Parameters:(param1_type)param1_varName                              param2_callName:(param2_type)param2_varName;@oxiri

Yuqorida, ortiqcha belgilarni bildiradi sinf usullari yoki sinfning o'zida chaqirilishi mumkin bo'lgan usullar (misolda emas) va minus alomatlar misol usullari, bu faqat sinfning ma'lum bir nusxasida chaqirilishi mumkin. Sinf usullari, shuningdek, misol o'zgaruvchilariga kirish huquqiga ega emas.

Yuqoridagi kod taxminan quyidagilarga teng C ++ interfeys:

sinf sinf nomi : jamoat superklassname {himoyalangan:  // misol o'zgaruvchilarijamoat:  // Sinf (statik) funktsiyalar  statik bekor *classMethod1();  statik return_type classMethod2();  statik return_type classMethod3(param1_type param1_varName);  // Instance (member) funktsiyalari  return_type instanceMethod1With1Parameter(param1_type param1_varName);  return_type  instanceMethod2With2Parameters(param1_type param1_varName,                                 param2_type param2_varName = sukut bo'yicha);};

Yozib oling instanceMethod2With2Parameters: param2_callName: selektor segmentlarining argumentli ifodalar bilan o'zaro bog'liqligini namoyish etadi, buning uchun C / C ++ da to'g'ridan-to'g'ri ekvivalent mavjud emas.

Qaytish turlari har qanday standart bo'lishi mumkin C turi, umumiy Objective-C ob'ektiga ko'rsatgich, NSArray *, NSImage * yoki NSString * kabi ob'ektning ma'lum bir turiga ko'rsatgich yoki usul tegishli bo'lgan sinfga ko'rsatuvchi (instancetype). Standart qaytish turi umumiy Objective-C tipidir id.

Metod argumentlari usul nomining bir qismi bo'lgan argumentni yorliq bilan nomlash bilan boshlanadi, so'ngra nuqta va undan keyin qavs ichida kutilayotgan argument turi va argument nomi. Yorliq qoldirilishi mumkin.

- (bekor)setRangeStart:(int)boshlang oxiri:(int)oxiri;- (bekor)importDocumentWithName:(NSString *)ism      bilanSpecifiedPreferences:(Afzalliklar *)prefs                    beforePage:(int)insertPage;

Interfeys ta'rifining hosilasi bu toifasi, bu mavjud sinflarga usullarni qo'shishga imkon beradi.[22]

Amalga oshirish

Interfeys faqat sinf interfeysini e'lon qiladi va usullarning o'zi emas: haqiqiy kod dastur faylida yozilgan. Amalga oshirish (usul) fayllari odatda fayl kengaytmasiga ega .m, dastlab "xabarlar" ni anglatardi.[23]

@ amalga oshirish sinf nomi+ (return_type)sinf usuli {  // amalga oshirish}- (return_type)instanceMethod {  // amalga oshirish}@oxiri

Usullar interfeys deklaratsiyalari yordamida yoziladi. Maqsad-C va C bilan taqqoslash:

- (int)usul:(int)men {  qaytish [o'zini o'zi square_root:men];}
int funktsiya(int men) {  qaytish square_root(men);}

Sintaksis psevdo- ga imkon beradiargumentlarni nomlash.

- (bekor)changeColorToRed:(suzmoq)qizil yashil:(suzmoq)yashil ko'k:(suzmoq)ko'k {  // ... Amalga oshirish ...}// Shunday chaqiriladi:[myColor changeColorToRed:5.0 yashil:2.0 ko'k:6.0];

Uslubning ichki ko'rinishlari Objective-C ning turli xil dasturlari orasida farq qiladi. Agar myColor sinfga tegishli bo'lsa Rang, misol usuli -changeColorToRed: yashil: ko'k: ichki yorliqli bo'lishi mumkin _i_Color_changeColorToRed_green_blue. The men misol uslubiga murojaat qilishdir, sinf va keyin metod nomlari qo'shilib, ikki nuqta pastki chiziqlarga o'zgartirildi. Parametrlar tartibi usul nomining bir qismi bo'lganligi sababli, uni kodlash uslubiga yoki ifoda nomiga mos parametrlarga mos ravishda o'zgartirish mumkin emas.

Biroq, funktsiyaning ichki nomlari kamdan-kam hollarda to'g'ridan-to'g'ri ishlatiladi. Odatda, xabarlar Objective-C ish vaqti kutubxonasida belgilangan funktsiya chaqiruvlariga aylantiriladi. Qaysi usul chaqirilishi havola vaqtida ma'lum emas, chunki qabul qiluvchining klassi (xabar yuborilayotgan ob'ekt) ish vaqtigacha ma'lum bo'lmasligi kerak.

Mavzu

Objective-C klassi yozilgandan so'ng uni instantatsiya qilish mumkin. Bu avval sinfning (ob'ektning) boshlanmagan nusxasini ajratish va keyin uni boshlash orqali amalga oshiriladi. Ikkala bosqich ham bajarilguncha ob'ekt to'liq ishlamaydi. Ushbu qadamlar bitta satr kodi bilan bajarilishi kerak, shunda hech qachon boshlang'ich jarayoniga o'tmagan ajratilgan ob'ekt bo'lmaydi (va oraliq natijani saqlab qolish aqlsizdir -init chaqirilganidan farqli ob'ektni qaytarishi mumkin).

Sukut bo'yicha parametr, parametrsiz boshlovchi:

MyObject *foo = [[MyObject ajratmoq] init];

Maxsus boshlovchi bilan ko'rsatma:

MyObject *foo = [[MyObject ajratmoq] initWithString:myString];

Hech qanday moslashtirilgan ishga tushirish amalga oshirilmagan taqdirda, "yangi" usulni tez-tez ajratish xabarlari o'rniga ishlatish mumkin:

MyObject *foo = [MyObject yangi];

Bundan tashqari, ba'zi sinflar sinf usulining boshlang'ichlarini amalga oshiradilar. Yoqdi + yangi, ular birlashadi + ajratmoq va -init, ammo farqli o'laroq + yangi, ular avtomatik nashr etilgan nusxani qaytaradilar. Ba'zi sinf usullarini boshlash qurilmalari parametrlarni oladi:

MyObject *foo = [MyObject ob'ekt];MyObject *bar = [MyObject objectWithString:@ "Vikipediya :)"];

The ajratmoq xabar ob'ekt uchun barcha instansiya o'zgaruvchilarini saqlash uchun etarli xotirani ajratadi, barcha instansiya o'zgaruvchilarini nol qiymatlarga o'rnatadi va xotirani sinfning namunasiga aylantiradi; boshlash paytida hech qanday nuqtada xotira superklassning misoli bo'lmaydi.

The init xabar yaratilgandan so'ng misoli o'rnatishni amalga oshiradi. The init usul ko'pincha quyidagicha yoziladi:

- (id)init {    o'zini o'zi = [super init];    agar (o'zini o'zi) {        // bu erda ob'ektni ishga tushirishni amalga oshirish    }    qaytish o'zini o'zi;}

Yuqoridagi misolda e'tibor bering id qaytish turi. Ushbu turdagi ob'ektiv-C-da "har qanday ob'ektga ko'rsatgich" degan ma'noni anglatadi (Qarang Dinamik yozuv Bo'lim).

Initsitatsiya usuli ishga tushirishidan oldin ob'ektni o'zining super klassi tomonidan to'g'ri ishga tushirilganligini ta'minlash uchun initsializator naqshidan foydalaniladi. U quyidagi harakatlarni amalga oshiradi:

  1. self = [super init]
    Superklass instansiyasini yuboradi init xabar beradi va natijani quyidagiga tayinlaydi o'zini o'zi (joriy ob'ektga ko'rsatgich).
  2. agar (o'zini)
    Qaytgan ob'ekt ko'rsatgichi har qanday boshlashni amalga oshirishdan oldin haqiqiyligini tekshiradi.
  3. o'zini o'zi qaytarish
    Qo'ng'iroq qiluvchining o'ziga o'zi qiymatini qaytaradi.

Yaroqsiz ob'ekt ko'rsatkichi qiymatga ega nol; "if" kabi shartli gaplar nilga null ko'rsatgich kabi qaraydi, shuning uchun agar boshlang'ich kod bajarilmaydi, agar [super init] nil bo'lsa. Agar ishga tushirishda xato bo'lsa, init usuli har qanday tozalashni amalga oshirishi kerak, shu jumladan o'ziga "ozod qilish" xabarini yuboradi va qaytadi nol ishga tushirish muvaffaqiyatsiz tugaganligini ko'rsatish uchun. Bunday xatolar uchun har qanday tekshiruv faqat ob'ektni yo'q qilish to'g'ri bajarilishini ta'minlash uchun superklassni ishga tushirishni chaqirgandan so'ng amalga oshirilishi kerak.

Agar sinfda bir nechta boshlash usuli mavjud bo'lsa, ulardan faqat bittasi ("belgilangan boshlang'ich") ushbu naqshga amal qilishi kerak; boshqalar superklass boshlang'ich o'rniga belgilangan boshlovchi chaqirishi kerak.

Protokollar

Boshqa dasturlash tillarida bular "interfeyslar" deb nomlanadi.

Ob'ektiv-C kengaytirilgan Keyingisi tushunchasini tanishtirish ko'p meros spetsifikatsiyasi, lekin joriy etish orqali emas protokollar. Bu mavhum ko'p meros bo'lib o'tgan asosiy sinf sifatida ham erishish mumkin bo'lgan naqshdir C ++, yoki "interfeys" sifatida (Java va kabi C # ). Objective-C chaqirilgan vaqtinchalik protokollardan foydalanadi norasmiy protokollar va kompilyator tomonidan bajariladigan protokollar deb nomlangan rasmiy protokollar.

Norasmiy protokol bu sinf amalga oshirishi mumkin bo'lgan usullar ro'yxati. Bu hujjatda ko'rsatilgan, chunki u tilda mavjud emas. Norasmiy protokollar a sifatida amalga oshiriladi toifasi (pastga qarang) NSObject-da va ko'pincha ixtiyoriy usullarni o'z ichiga oladi, agar ular amalga oshirilsa, sinfning xatti-harakatlarini o'zgartirishi mumkin. Masalan, matn maydonlari sinfida a bo'lishi mumkin delegat norasmiy protokolni foydalanuvchi tomonidan kiritilgan matnni avtomatik to'ldirishni amalga oshirish uchun ixtiyoriy usul bilan amalga oshiradi. Matn maydonida delegat ushbu usulni amalga oshiradimi yoki yo'qligini aniqlaydi aks ettirish ) va agar shunday bo'lsa, avtomatik to'ldirish xususiyatini qo'llab-quvvatlash uchun delegat usulini chaqiradi.

Rasmiy protokol an ga o'xshaydi interfeys Java, C # va Ada 2005 yil. Bu har qanday sinf amalga oshirish uchun o'zini e'lon qilishi mumkin bo'lgan usullarning ro'yxati. Objective-C versiyasidan 2.0gacha bo'lgan versiyalari, sinf o'zini o'zi qabul qilyapti deb e'lon qilgan protokolda barcha usullarni bajarishi kerak; kompilyator xato e'lon qiladi, agar sinf e'lon qilingan protokollaridan har qanday usulni amalga oshirmasa. Ob'ektiv-C 2.0 protokolda ma'lum usullarni belgilashni qo'llab-quvvatlashni qo'shdi va kompilyator ixtiyoriy usullarni amalga oshirishga majbur qilmaydi.

Ushbu protokolni unga mos kelishi uchun amalga oshirish uchun sinf e'lon qilinishi kerak. Bu ish vaqtida aniqlanadi. Rasmiy protokollar biron bir dasturni ta'minlay olmaydi; ular shunchaki qo'ng'iroq qiluvchilarni protokolga mos keladigan sinflar amalga oshirilishini ta'minlaydi. NeXT / Apple kutubxonasida protokollar tez-tez Distributed Objects tizimi tomonidan masofaviy tizimda bajariladigan ob'ekt qobiliyatlarini ifodalash uchun foydalaniladi.

Sintaksis

@ protokol NSLocking- (bekor)qulflash;- (bekor)qulfni ochish;@oxiri

qulflashning mavhum g'oyasi mavjudligini anglatadi. Sinf ta'rifida protokol amalga oshirilishini aytib,

@ interfeys NSLock : NSObject <NSLocking>// ...@oxiri

NSLock misollari, ular ikkita instansiya usuli uchun dasturni taqdim etishlarini da'vo qilmoqda.

Dinamik yozuv

Objective-C, masalan, Smalltalk-dan foydalanishi mumkin dinamik yozish: ob'ektga uning interfeysida ko'rsatilmagan xabar yuborilishi mumkin. Bu moslashuvchanlikni oshirishi mumkin, chunki u ob'ektga xabarni "yozib olish" va xabarga mos ravishda javob bera oladigan xabarni boshqa ob'ektga yuborish yoki xuddi shu tarzda xabarni boshqa ob'ektga yuborish imkonini beradi. Ushbu xatti-harakatlar sifatida tanilgan xabarni yo'naltirish yoki delegatsiya (pastga qarang). Shu bilan bir qatorda, xabarni yuborib bo'lmaydigan bo'lsa, xato ishlov beruvchidan foydalanish mumkin. Agar ob'ekt xabarni uzatmasa, unga javob bermasa yoki xatoga yo'l qo'ymasa, u holda tizim ish vaqti istisnosini yaratadi.[24] Agar xabarlar yuborilsa nol (null ob'ekt ko'rsatgichi), ular jimgina e'tiborga olinmaydi yoki kompilyator variantlariga qarab umumiy istisnoni keltirib chiqaradi.

Statik matn terish to'g'risidagi ma'lumotlar ixtiyoriy ravishda o'zgaruvchilarga qo'shilishi mumkin. Ushbu ma'lumotlar keyinchalik kompilyatsiya vaqtida tekshiriladi. Keyingi to'rtta bayonotda tobora o'ziga xos turdagi ma'lumotlar keltirilgan. Bayonotlar ishlash vaqtida tengdir, ammo qo'shimcha ma'lumotlar kompilyatorga dasturchini ogohlantirishi mumkin, agar berilgan argument ko'rsatilgan turga mos kelmasa.

- (bekor)setMyValue:(id)foo;

Yuqoridagi bayonotda, foo har qanday sinf bo'lishi mumkin.

- (bekor)setMyValue:(id<NSC nusxasi>)foo;

Yuqoridagi bayonotda, foo ga mos keladigan har qanday sinfning namunasi bo'lishi mumkin NSC nusxasi protokol.

- (bekor)setMyValue:(NS raqami *)foo;

Yuqoridagi bayonotda, foo ning misoli bo'lishi kerak NS raqami sinf.

- (bekor)setMyValue:(NS raqami<NSC nusxasi> *)foo;

Yuqoridagi bayonotda, foo ning misoli bo'lishi kerak NS raqami sinfiga mos kelishi kerak NSC nusxasi protokol.

Objective-C-da barcha ob'ektlar ko'rsatgich sifatida namoyish etiladi va statik initsializatsiyaga yo'l qo'yilmaydi. Eng oddiy ob'ekt - bu turi id (objc_obj *) ga ishora qiladi, unda faqat an mavjud isa uning sinfini tavsiflovchi ko'rsatgich. C ning boshqa turlari, masalan, qiymatlar va tuzilmalar, o'zgarmaydi, chunki ular ob'ekt tizimiga kirmaydi. Ushbu qaror tuzilmalar va sinflar birlashtirilgan C ++ ob'ekt modelidan farq qiladi.

Ekspeditorlik

Objective-C javob bermasligi mumkin bo'lgan ob'ektga xabar yuborishga ruxsat beradi. Javob berish yoki oddiygina xabarni tashlab yuborish o'rniga, ob'ekt xabarni javob bera oladigan ob'ektga yo'naltirishi mumkin. Ekspeditorlik yordamida aniq amallarni soddalashtirish uchun foydalanish mumkin dizayn naqshlari kabi kuzatuvchi namunasi yoki proksi-server namunasi.

Objective-C ish vaqti bir juft usulni belgilaydi Ob'ekt

  • yo'naltirish usullari:
    - (retval_t)oldinga:(SEL)sel arglar:(arglist_t)kamon; // GCC bilan- (id)oldinga:(SEL)sel arglar:(marg_list)kamon; // NeXT / Apple tizimlari bilan
  • harakat usullari:
    - (retval_t)amalga oshirish:(SEL)sel arglar:(arglist_t)kamon; // GCC bilan- (id)amalga oshirish:(SEL)sel arglar:(marg_list)kamon; // NeXT / Apple tizimlari bilan

Ekspeditsiyani amalga oshirishni istagan ob'ekt ekspeditorlik xatti-harakatini aniqlash uchun ekspeditsiya usulini yangi usul bilan bekor qilishi kerak. Harakat usuli performv :: bekor qilinmasligi kerak, chunki bu usul faqat selektor va dalillarga asoslangan harakatni amalga oshiradi. E'tibor bering SEL turi, bu ob'ektiv-C-dagi xabarlar turi.

Eslatma: OpenStep, Cocoa va GNUstep-da, Objective-C-ning tez-tez ishlatiladigan ramkalarida, Ob'ekt sinf. The - (bekor) oldinga chaqiruv: (NSInvocation *) chaqiruv usuli NSObject sinf ekspeditorlik qilish uchun ishlatiladi.

Misol

Ekspeditorlik asoslarini namoyish etadigan dasturning namunasi.

Ekspeditor.h
#import @ interfeys Ekspeditor : Ob'ekt {  id oluvchi; // Biz xabarni uzatmoqchi bo'lgan ob'ekt.}// Accessor usullari.- (id)oluvchi;- (id)setRecipient:(id)_qabul qiluvchi;@oxiri
Ekspeditor.m
#import "Ekspeditor.h"@ amalga oshirish Ekspeditor- (retval_t)oldinga:(SEL)sel arglar:(arglist_t)kamon {  /*  * Qabul qiluvchining xabarga haqiqatan ham javob berishini tekshiring.  * Bu istalgan bo'lishi mumkin yoki bo'lmasligi mumkin, masalan, agar oluvchi bo'lsa  * o'z navbatida xabarga javob bermaydi, balki yo'naltirishni amalga oshirishi mumkin  * o'zi.  */  agar ([oluvchi javob beradiToSelector:sel]) {    qaytish [oluvchi bajarish:sel kamon:kamon];  } boshqa {    qaytish [o'zini o'zi xato:"Qabul qiluvchining javobi yo'q"];  }}- (id)setRecipient:(id)_qabul qiluvchi {  [oluvchi avtoulovni ozod qilish];  oluvchi = [_qabul qiluvchi saqlamoq];  qaytish o'zini o'zi;}- (id)oluvchi {  qaytish oluvchi;}@oxiri
Qabul qiluvchi.h
#import // Qabul qiluvchining oddiy ob'ekti.@ interfeys Qabul qiluvchi : Ob'ekt- (id)Salom;@oxiri
Qabul qiluvchi.m
#import "Recipient.h"@ amalga oshirish Qabul qiluvchi- (id)Salom {  printf("Qabul qiluvchi salom! n");  qaytish o'zini o'zi;}@oxiri
asosiy.m
#import "Ekspeditor.h"#import "Recipient.h"int asosiy(bekor) {  Ekspeditor *ekspeditor = [Ekspeditor yangi];  Qabul qiluvchi *oluvchi = [Qabul qiluvchi yangi];  [ekspeditor setRecipient:oluvchi]; // Qabul qiluvchini o'rnating.  /*  * Ekspeditor salom xabariga javob bermaydi! Bo'ladi  * uzatilishi kerak. Barcha tanilmagan usullar yo'naltiriladi  * oluvchi  * (agar oluvchi ularga javob bersa, Ekspeditorda yozilganidek)  */  [ekspeditor Salom];  [oluvchi ozod qilish];  [ekspeditor ozod qilish];  qaytish 0;}

Izohlar

Yordamida tuzilganda gcc, kompilyator xabar beradi:

$ gcc -x ob'ektiv-c -Wno-import Forwarder.m Recipient.m main.m -lobjcmain.m: "main" funktsiyasida: main.m: 12: ogohlantirish: "Ekspeditor" "salom" ga javob bermaydi $

Tuzuvchi ilgari aytilgan fikrni bildirmoqda Ekspeditor salom xabarlariga javob bermaydi. Bunday holatda, yo'naltirish amalga oshirilganligi sababli ogohlantirishni e'tiborsiz qoldirish mumkin. Dasturni ishga tushirish quyidagi natijani beradi:

$ ./a.outRecipient salom aytmoqda!

Kategoriyalar

Objective-C-ni ishlab chiqish paytida asosiy muammolardan biri bu katta kod bazalarini saqlab turish edi. Dan tajriba tizimli dasturlash dunyo kodni takomillashtirishning asosiy usullaridan biri uni kichik qismlarga ajratish ekanligini ko'rsatdi. Maqsad-C qarz oldi va kontseptsiyasini kengaytirdi toifalar Ushbu jarayonga yordam berish uchun Smalltalk dasturlaridan.[25]

Bundan tashqari, toifadagi usullar sinfga qo'shiladi ish vaqti. Shunday qilib, toifalar dasturchiga mavjud bo'lgan sinfga usullarni qo'shishga imkon beradi - an ochiq dars - bu sinfni qayta kompilyatsiya qilish yoki hatto uning manba kodidan foydalanish huquqiga ega bo'lmasdan. Masalan, tizimda a imlo tekshiruvchisi String dasturida uni String manba kodini o'zgartirmasdan qo'shish mumkin edi.

Dasturlar ishga tushirilganda toifalardagi usullar sinfdagi usullardan farq qilmaydi. Kategoriya sinfdagi barcha o'zgaruvchilarga, shu jumladan xususiy o'zgaruvchilarga to'liq kirish huquqiga ega.

Agar toifada bir xil usul e'lon qilingan bo'lsa usul imzosi sinfdagi mavjud usul sifatida toifadagi usul qabul qilingan. Shunday qilib toifalar nafaqat sinfga metodlarni qo'shibgina qolmay, balki mavjud bo'lgan usullarni ham almashtirishlari mumkin. Ushbu funktsiyadan boshqa sinflardagi xatolarni tuzatish, ularning usullarini qayta yozish yoki dastur ichidagi sinfning xatti-harakatini global o'zgartirish uchun foydalanish mumkin. Agar ikkita toifada bir xil nomdagi usullar mavjud bo'lsa, lekin turli xil imzolar mavjud bo'lsa, qaysi toifadagi usul qabul qilinganligi aniqlanmagan.

Boshqa tillar ushbu xususiyatni turli yo'llar bilan qo'shishga harakat qilishdi. Tom Objective-C tizimini bir qadam oldinga olib chiqdi va o'zgaruvchilar qo'shilishiga ham imkon berdi. Boshqa tillar ishlatilgan prototipga asoslangan o'rniga echimlar, eng ko'zga ko'ringan narsa O'zi.

C # va Visual Basic.NET tillari yuzaki o'xshash funktsiyalarni kengaytirish usullari, ammo bu sinfning xususiy o'zgaruvchilariga kirish imkoniyati yo'q.[26] Yoqut va boshqa bir qancha dinamik dasturlash tillari texnikani "maymunni yamoqlash ".

Logtalk Objective-C toifalari funktsiyasini (Logtalk toifalari, masalan, yangi sinflar yoki prototiplarni belgilashda ingichka taneli birliklar sifatida ham foydalanish mumkin; toifadagi Logtalk toifasi deyarli bo'lishi mumkin) toifalari kontseptsiyasini amalga oshiradi. har qanday sonli sinflar va prototiplar tomonidan import qilingan).

Kategoriyalardan namunaviy foydalanish

Ushbu misol an Butun son sinf, avval faqat asosiy sinfni belgilash orqali accessor usullari amalga oshirildi va ikkita toifani qo'shib, Arifmetik va Displey, asosiy sinfni kengaytiradigan. Kategoriyalar bazaviy sinfning shaxsiy ma'lumotlar a'zolariga kirishlari mumkin bo'lsa-da, ko'pincha bu shaxsiy ma'lumotlar a'zolariga kirish metodlari orqali kirish yaxshi amaliyotdir, bu esa toifalarni asosiy sinfdan ancha mustaqil saqlashga yordam beradi. Bunday kiruvchi vositalarni amalga oshirish toifalarning odatiy usullaridan biridir. Boshqasi, asosiy sinfga usullarni qo'shish uchun toifalardan foydalanish. Shu bilan birga, subklassni bekor qilish uchun toifalardan foydalanish yaxshi amaliyot deb qaralmaydi, shuningdek, ma'lum maymunni yamoqlash. Norasmiy protokollar kategoriya sifatida bazada amalga oshiriladi NSObject sinf. An'anaga ko'ra, asosiy sinflarni kengaytiradigan toifalarni o'z ichiga olgan fayllar nom oladi BaseClass + ExtensionClass.h.

Integer.h
#import @ interfeys Butun son : Ob'ekt {  int tamsayı;}- (int)tamsayı;- (id)butun son:(int)_integer;@oxiri
Integer.m
#import "Integer.h"@ amalga oshirish Butun son- (int) tamsayı {  qaytish tamsayı;}- (id) butun son: (int) _integer {  tamsayı = _integer;  qaytish o'zini o'zi;}@oxiri
Integer + Arithmetic.h
#import "Integer.h"@ interfeys Butun son (Arifmetik)- (id) qo'shish: (Butun son *) qo'shimchalar;- (id) pastki: (Butun son *) subtrahend;@oxiri
Integer + Arithmetic.m
# import "Integer + Arithmetic.h".@ amalga oshirish Butun son (Arifmetik)- (id) qo'shish: (Butun son *) qo'shimchalar {  qaytish [o'zini o'zi tamsayı: [o'zini o'zi tamsayı] + [qo'shimchalar tamsayı]];}- (id) pastki: (Butun son *) subtrahend {  qaytish [o'zini o'zi tamsayı: [o'zini o'zi tamsayı] - [subtrahend tamsayı]];}@oxiri
Integer + Display.h
#import "Integer.h"@ interfeys Butun son (Displey)- (id) shou yulduzlari;- (id) ko'rgazma;@oxiri
Integer + Display.m
# import "Integer + Display.h"@ amalga oshirish Butun son (Displey)- (id) shou yulduzlari {  int men, x = [o'zini o'zi tamsayı];  uchun (men = 0; men < x; men++) {    printf("*");  }  printf(" n");  qaytish o'zini o'zi;}- (id) ko'rgazma {  printf("% d n", [o'zini o'zi tamsayı]);  qaytish o'zini o'zi;}@oxiri
asosiy.m
#import "Integer.h"#import "Integer + Arithmetic.h"#import "Integer + Display.h"int asosiy(bekor) {  Butun son *num1 = [Butun son yangi], *num2 = [Butun son yangi];  int x;  printf("Butun sonni kiriting:");  skanf("% d", &x);  [num1 tamsayı:x];  [num1 shou yulduzlari];  printf("Butun sonni kiriting:");  skanf("% d", &x);  [num2 tamsayı:x];  [num2 shou yulduzlari];  [num1 qo'shish:num2];  [num1 ko'rgazma];  qaytish 0;}

Izohlar

Kompilyatsiya, masalan:

gcc -x ob'ektiv-c main.m Integer.m Integer + Arithmetic.m Integer + Display.m -lobjc

Kimdir tashqarida qoldirib tajriba o'tkazishi mumkin #import "Integer + Arithmetic.h" va [num1 qo'shish: num2] chiziqlar va qoldirish Integer + Arithmetic.m kompilyatsiya. Dastur hali ham ishlaydi. Buning iloji borligini anglatadi aralashtiramiz agar kerak bo'lsa toifalarni qo'shdi; agar toifaga biron bir qobiliyat kerak bo'lmasa, u shunchaki kompilyatsiya qilinishi mumkin emas.

Pozitsiya

Objective-C sinfga dastur ichida boshqa sinfni to'liq almashtirishga ruxsat beradi. O'rnini bosadigan sinf maqsadli sinf sifatida "pozitsiyani" egallashi aytiladi.

Sinf pozlari bekor qilingan deb e'lon qilindi Mac OS X v10.5, va 64-bitlik ish vaqti mavjud emas. Shunga o'xshash funktsiyalarni bitta usulni boshqasiga bir xil imzo bilan almashtiradigan toifalarda almashtirish usulidan foydalanish orqali erishish mumkin.

Hali ham poz qo'yishni qo'llab-quvvatlaydigan versiyalar uchun maqsadli sinfga yuborilgan barcha xabarlar o'rniga posing klassi qabul qilinadi. Bir nechta cheklovlar mavjud:

  • Sinf faqat to'g'ridan-to'g'ri yoki bilvosita superklasslardan biri bo'lishi mumkin.
  • Poz beruvchi sinf maqsad sinfida mavjud bo'lmagan har qanday yangi misol o'zgaruvchilarini belgilamasligi kerak (garchi u usullarni belgilashi yoki bekor qilishi mumkin bo'lsa).
  • Maqsad sinfiga rasm qo'yishdan oldin hech qanday xabar kelmagan bo'lishi mumkin.

Pozitsiya, xuddi toifalarga o'xshash tarzda, mavjud sinflarni global miqyosda kengaytirishga imkon beradi. Kategoriyalarda mavjud bo'lmagan ikkita xususiyatga ruxsat berish:

  • Poz beruvchi sinf super-usul orqali bekor qilingan usullarni chaqirishi mumkin va shu bilan maqsad sinfining bajarilishini o'z ichiga oladi.
  • Poz beradigan sinf toifalarda belgilangan usullarni bekor qilishi mumkin.

Masalan,

@ interfeys CustomNSApplication : Ilova@oxiri@ amalga oshirish CustomNSApplication- (bekor) setMainMenu: (NSMenu*) menyu {  // menyu bilan biror narsa qilish}@oxiriclass_poseAs ([CustomNSApplication sinf], [Ilova sinf]);

Bu setMainMenu-ning NSApplication-ga har qanday chaqiruvini to'xtatadi.

#Import

C tilida # shu jumladan oldindan kompilyatsiya qilish bo'yicha ko'rsatma har doim faylning tarkibini o'sha paytda manbaga kiritilishiga olib keladi. Maqsad-C-ga ega #Import direktiv, ekvivalenti, faqat har bir fayl kompilyatsiya bo'linmasiga faqat bir marta kiritilganligi sababli, ehtiyojni yo'qotadi soqchilarni o'z ichiga oladi.

Linux gcc kompilyatsiyasi

// FILE: salom.m#import int asosiy (int arg, konst char * argv[]){    / * Objective-C-dagi birinchi dasturim * /    NSLog(@"Salom Dunyo!  n");    qaytish 0;}
# Gcc va MinGW kompilyatori uchun buyruq satrini kompilyatsiya qilish:$ gcc \    $(gnustep-config --objc-flags) \    - salom \    salom.m \    -L / GNUstep / System / Library / Library \    -lobjc \    -lgnustep-base $ ./ salom

Boshqa xususiyatlar

Objective-C funktsiyalari ko'pincha dasturlash masalalarini moslashuvchan va ko'pincha oson hal qilishga imkon beradi.

  • Uslublarni boshqa ob'ektlarga topshirish va masofadan chaqirish toifalar va xabarlarni yo'naltirish yordamida osongina amalga oshirilishi mumkin.
  • Qaytish ning isa ko'rsatgich sinflarning ishlash vaqtida o'zgarishiga imkon beradi. Odatda uchun ishlatiladi disk raskadrovka bu erda bo'sh ob'ektlar zombi ob'ektlariga aylantiriladi, ularning maqsadi kimdir ularni chaqirganda xato haqida xabar berishdir. Swizzling ham ishlatilgan Korxona ob'ektlari doirasi ma'lumotlar bazasi xatolarini yaratish.[iqtibos kerak ] Swizzling bugungi kunda Apple Foundation Framework tomonidan amalga oshiriladi Asosiy qiymatni kuzatish.

Til variantlari

Ob'ektiv-C ++

Objective-C ++ - bu oldingi tomonga qadar qabul qilingan til variantidir GNU kompilyatori to'plami va Jiringlash, bu C ++ va Objective-C sintaksisining kombinatsiyasidan foydalanadigan manba fayllarini kompilyatsiya qilishi mumkin. Objective-C ++ C ++ ga C ga qo'shadigan kengaytmalarni qo'shadi, chunki har xil til xususiyatlari ortidagi semantikani birlashtirish uchun hech narsa qilinmaydi, ba'zi cheklovlar qo'llaniladi:

  • C ++ klassi Objective-C sinfidan kelib chiqishi mumkin emas va aksincha.
  • C ++ nom maydonlarini Objective-C deklaratsiyasida e'lon qilish mumkin emas.
  • Objective-C deklaratsiyalari faqat global miqyosda ko'rinishi mumkin, C ++ nomlari maydonida emas
  • Objective-C sinflari standart konstruktorga ega bo'lmagan yoki bir yoki bir nechta virtual usullarga ega bo'lgan C ++ sinflarining misol o'zgaruvchilariga ega bo'lishi mumkin emas,[iqtibos kerak ] ammo C ++ moslamalariga ko'rsatgichlar cheklovsiz misol o'zgaruvchilari sifatida ishlatilishi mumkin (ularni -init usulida yangilariga ajrating).
  • C ++ "qiymati bo'yicha" semantikasini faqat ko'rsatgichlar orqali kirish mumkin bo'lgan Objective-C ob'ektlariga qo'llash mumkin emas.
  • Objective-C deklaratsiyasi C ++ shablon deklaratsiyasida bo'lishi mumkin emas va aksincha. Biroq, ob'ektiv-C turlari (masalan, Sinf nomi *) C ++ shablon parametrlari sifatida ishlatilishi mumkin.
  • Objective-C va C ++ istisnolari bilan ishlash alohida; har birining ishlovchilari boshqa turdagi istisnolardan foydalana olmaydi. Natijada, ob'ektni yo'q qiladigan qurilmalar ishga tushirilmaydi. Yaqinda "Objective-C 2.0" ish vaqtlarida bu kamayadi, chunki Objective-C istisnolari to'liq C ++ istisnolari bilan almashtiriladi (Apple ish vaqti), yoki qisman Objective-C ++ kutubxonasi bog'langanda (GNUstep libobjc2).[27]
  • Ob'ektiv-C bloklari va C ++ 11 lambdalar alohida shaxslardir. Biroq, blok kutilgan lambdani uzatishda blok macOS-da shaffof ravishda hosil bo'ladi.[28]

Maqsad-C 2.0

2006 yilda Butunjahon ishlab chiquvchilar konferentsiyasi, Apple "Objective-C 2.0" ning chiqarilishini e'lon qildi, Objective-C tilini qayta ko'rib chiqishda "zamonaviy axlat yig'ish, sintaksisni takomillashtirish va[29] ish vaqtini yaxshilash,[30] va 64-bitli qo'llab-quvvatlash ". Mac OS X v10.5 2007 yil oktyabr oyida chiqarilgan, Objective-C 2.0 kompilyatorini o'z ichiga olgan. GCC 4.6 e'lon qilingan va sintezlangan xususiyatlar, nuqta sintaksisi, tezkor ro'yxatlash, ixtiyoriy protokol usullari, usul / protokol / sinf atributlari, sinf kengaytmalari va yangi GNU Objective-C ish vaqti API kabi ko'plab yangi Objective-C xususiyatlarini qo'llab-quvvatlaydi.[31]

Objective-C 2.0 nomlanishi tilning versiyalash tizimidagi uzilishni anglatadi, chunki NeXT uchun so'nggi ob'ektiv-C versiyasi "objc4" edi.[32] Ushbu loyiha nomi oldingi ob'ektiv-C ish vaqti manba kodining so'nggi nashrida saqlanib qoldi Mac OS X Leopard (10.5).[33]

Axlat yig'ish

Objective-C 2.0 ixtiyoriy ravishda konservativ, avlodni taqdim etdi axlat yig'uvchi. Yugurish paytida orqaga qarab mos keladi rejimida, ish vaqti aylandi ma'lumotni hisoblash ichiga "saqlash" va "qo'yib yuborish" kabi operatsiyalar yo'q. Axlat yig'ish imkoniyati yoqilganda barcha ob'ektlar axlat yig'ib olinishi kerak edi. Muntazam C ko'rsatkichlari "__strong" darajasiga ega bo'lishi mumkin, shuningdek, yozuvchi to'siqni tuzuvchi asosiy kompilyatorni ushlab turishi va shu bilan chiqindilarni yig'ishda qatnashishi mumkin.[34] Nolga teng zaif quyi tizim ham ta'minlandi, shunda ob'ekt (yoki sodda qilib aytganda, GC xotirasi) yig'ilganda "__weak" deb belgilangan ko'rsatkichlar nolga o'rnatiladi. Chiqindilarni yig'uvchi ob'ektiv-C 2.0 ning iOS dasturida mavjud emas.[35] Objective-C-dagi axlat yig'ish ustuvorligi past darajadagi ish zarrachasida ishlaydi va foydalanuvchi tajribasini sezgir saqlash maqsadida foydalanuvchi voqealarini to'xtatishi mumkin.[36]

Axlat yig'ish Mac OS X v10.8-da foydasiga bekor qilingan Avtomatik ma'lumotni hisoblash (ARC).[37] Maqsad-C yoqilgan iOS 7 yugurish ARM64 uses 19 bits out of a 64-bit word to store the reference count, as a form of belgilangan ko'rsatkichlar.[38][39]

Xususiyatlari

Objective-C 2.0 introduces a new syntax to declare instance variables as xususiyatlari, with optional attributes to configure the generation of accessor methods. Properties are, in a sense, public instance variables; that is, declaring an instance variable as a property provides external classes with access (possibly limited, e.g. read only) to that property. A property may be declared as "readonly", and may be provided with storage semantics such as tayinlamoq, nusxa ko'chirish yoki saqlamoq. By default, properties are considered atom, which results in a lock preventing multiple threads from accessing them at the same time. A property can be declared as nonatomic, which removes this lock.

@interface Shaxs : NSObject {@public  NSString *ism;@private  int yoshi;}@property(nusxa ko'chirish) NSString *ism;@property(faqat o'qish) int yoshi;- (id)initWithAge:(int)yoshi;@oxiri

Properties are implemented by way of the @synthesize keyword, which generates getter (and setter, if not read-only) methods according to the property declaration. Alternatively, the getter and setter methods must be implemented explicitly, or the @dynamic keyword can be used to indicate that accessor methods will be provided by other means. When compiled using clang 3.1 or higher, all properties which are not explicitly declared with @dynamic, belgilangan faqat o'qish or have complete user-implemented getter and setter will be automatically implicitly @synthesize'd.

@ amalga oshirish Shaxs@synthesize ism;- (id)initWithAge:(int)initAge {  o'zini o'zi = [super init];  agar (o'zini o'zi) {    // NOTE: direct instance variable assignment, not property setter    yoshi = initAge;   }  qaytish o'zini o'zi;}- (int)yoshi {  qaytish yoshi;}@oxiri

Properties can be accessed using the traditional message passing syntax, dot notation, or, in Key-Value Coding, by name via the "valueForKey:"/"setValue:forKey:" methods.

Shaxs *Shaxs = [[Shaxs ajratmoq] initWithAge:53];Shaxs.ism = @"Steve"; // NOTE: dot notation, uses synthesized setter,                         // equivalent to [aPerson setName: @"Steve"];NSLog(@"Access by message (%@), dot notation(%@), property name(% @) and          to'g'ridan-to'g'ri misol o'zgaruvchan kirish(% @) ",              [Shaxs ism],      Shaxs.ism, [Shaxs valueForKey:@"name"], Shaxs -> ism);

In order to use dot notation to invoke property accessors within an instance method, the "self" keyword should be used:

- (bekor)introduceMyselfWithProperties:(BOOL)useGetter {  NSLog(@"Hi, my name is %@.", (useGetter ? o'zini o'zi.ism : ism));  // NOTE: getter vs. ivar access}

A class or protocol's properties may be dynamically introspected.

int men;int propertyCount = 0;objc_property_t *propertyList =    class_copyPropertyList([Shaxs sinf], &propertyCount);uchun (men = 0; men < propertyCount; men++) {  objc_property_t *thisProperty = propertyList + men;  konst char *propertyName = property_getName(*thisProperty);  NSLog(@"Person has a property: '%s'", propertyName);}

Non-fragile instance variables

Objective-C 2.0 provides non-fragile instance variables where supported by the runtime (i.e. when building code for 64-bit macOS, and all iOS). Under the modern runtime, an extra layer of indirection is added to instance variable access, allowing the dynamic linker to adjust instance layout at runtime. This feature allows for two important improvements to Objective-C code:

  • It eliminates the nozik ikkilik interfeys muammosi; superclasses can change sizes without affecting binary compatibility.
  • It allows instance variables that provide the backing for properties to be synthesized at runtime without them being declared in the class's interface.

Fast enumeration

Instead of using an NSEnumerator object or indices to iterate through a collection, Objective-C 2.0 offers the fast enumeration syntax. In Objective-C 2.0, the following loops are functionally equivalent, but have different performance traits.

// Using NSEnumeratorNSEnumerator *enumerator = [thePeople objectEnumerator];Shaxs *p;esa ((p = [enumerator nextObject]) != nol) {  NSLog(@"%@ is %i years old.", [p ism], [p yoshi]);}
// Using indexesuchun (int men = 0; men < [thePeople hisoblash]; men++) {  Shaxs *p = [thePeople objectAtIndex:men];  NSLog(@"%@ is %i years old.", [p ism], [p yoshi]);}
// Using fast enumerationuchun (Shaxs *p yilda thePeople) {  NSLog(@"%@ is %i years old.", [p ism], [p yoshi]);}

Fast enumeration generates more efficient code than standard enumeration because method calls to enumerate over objects are replaced by pointer arithmetic using the NSFastEnumeration protocol.[40]

Class extensions

A class extension has the same syntax as a category declaration with no category name, and the methods and properties declared in it are added directly to the main class. It is mostly used as an alternative to a category to add methods to a class without advertising them in the public headers, with the advantage that for class extensions the compiler checks that all the privately declared methods are actually implemented.[41]

Implications for Cocoa development

All Objective-C applications developed for macOS that make use of the above improvements for Objective-C 2.0 are incompatible with all operating systems prior to 10.5 (Leopard). Since fast enumeration does not generate exactly the same binaries as standard enumeration, its use will cause an application to crash on Mac OS X version 10.4 or earlier.

Bloklar

Blocks is a nonstandard extension for Objective-C (and C va C ++ ) that uses special syntax to create yopilish. Blocks are only supported in Mac OS X 10.6 "Snow Leopard" yoki keyinroq, iOS 4 or later, and GNUstep with libobjc2 1.7 and compiling with clang 3.1 yoki undan keyin.[42]

# shu jumladan <stdio.h># shu jumladan <Block.h>typedef int (^IntBlock)();IntBlock MakeCounter(int boshlang, int o'sish) {	__block int men = boshlang;	qaytish Block_copy( ^ {		int ret = men;		men += o'sish;		qaytish ret;	});}int asosiy(bekor) {	IntBlock mycounter = MakeCounter(5, 2);	printf("First call: %d n", mycounter());	printf("Second call: %d n", mycounter());	printf("Third call: %d n", mycounter());	/* because it was copied, it must also be released */	Block_release(mycounter);	qaytish 0;}/* Output:	First call: 5	Second call: 7	Third call: 9*/

Modern Objective-C

Apple has added some additional features to Objective 2.0 over time. The additions only apply to the "Apple LLVM compiler", i.e. clang frontend of the language. Confusingly, the versioning used by Apple differs from that of the LLVM upstream; refer to XCode § Toolchain versions for a translation to open-source LLVM version numbers.[43]

Avtomatik ma'lumotni hisoblash

Automatic Reference Counting (ARC) is a compile-time feature that eliminates the need for programmers to manually manage retain counts using saqlamoq va ozod qilish.[44] Aksincha axlat yig'ish, which occurs at run time, ARC eliminates the overhead of a separate process managing retain counts. ARC and manual memory management are not mutually exclusive; programmers can continue to use non-ARC code in ARC-enabled projects by disabling ARC for individual code files. Xcode can also attempt to automatically upgrade a project to ARC.

ARC was introduced in LLVM 3.0. This translates to XCode 4.2 (2011), or Apple LLVM compiler 3.0.[45]

Literallar

NeXT and Apple Obj-C runtimes have long included a short-form way to create new strings, using the literal syntax @"a new string", or drop to CoreFoundation constants kCFBooleanTrue va kCFBooleanFalse uchun NS raqami with Boolean values. Using this format saves the programmer from having to use the longer initWithString or similar methods when doing certain operations.

When using Apple LLVM compiler 4.0 (XCode 4.4) or later, arrays, dictionaries, and numbers (NSArray, NSDictionary, NS raqami classes) can also be created using literal syntax instead of methods.[46] (Apple LLVM compiler 4.0 translates to open source LLVM and Clang 3.1.)[47]

Example without literals:

NSArray *myArray = [NSArray arrayWithObjects:object1,object2,object3,nol];NSDictionary *myDictionary1 = [NSDictionary dictionaryWithObject:someObject forKey:@"key"];NSDictionary *myDictionary2 = [NSDictionary dictionaryWithObjectsAndKeys:object1, kalit1, object2, key2, nol];NS raqami *myNumber = [NS raqami numberWithInt:myInt];NS raqami *mySumNumber= [NS raqami numberWithInt:(2 + 3)];NS raqami *myBoolNumber = [NS raqami numberWithBool:HA];

Example with literals:

NSArray *myArray = @[ object1, object2, object3 ];NSDictionary *myDictionary1 = @{ @"key" : someObject };NSDictionary *myDictionary2 = @{ kalit1: object1, key2: object2 };NS raqami *myNumber = @(myInt);NS raqami *mySumNumber = @(2+3);NS raqami *myBoolNumber = @YES;NS raqami *myIntegerNumber = @8;

However, different from torli harflar, which compile to constants in the executable, these literals compile to code equivalent to the above method calls. In particular, under manually reference-counted memory management, these objects are autoreleased, which requires added care when e.g., used with function-static variables or other kinds of globals.

Subscripting

When using Apple LLVM compiler 4.0 or later, arrays and dictionaries (NSArray va NSDictionary classes) can be manipulated using subscripting.[46] Subscripting can be used to retrieve values from indexes (array) or keys (dictionary), and with mutable objects, can also be used to set objects to indexes or keys. In code, subscripting is represented using brackets [ ].[48]

Example without subscripting:

id object1 = [someArray objectAtIndex:0];id object2 = [someDictionary objectForKey:@"key"];[someMutableArray replaceObjectAtIndex:0 withObject:object3];[someMutableDictionary setObject:object4 forKey:@"key"];

Example with subscripting:

id object1 = someArray[0];id object2 = someDictionary[@"key"];someMutableArray[0] = object3;someMutableDictionary[@"key"] = object4;

"Modern" Objective-C syntax (1997)

After the purchase of NeXT by Apple, attempts were made to make the language more acceptable to programmers more familiar with Java than Smalltalk. One of these attempts was introducing what was dubbed "Modern Syntax" for Objective-C at the time[49] (as opposed to the current, "classic" syntax). There was no change in behaviour, this was merely an alternative syntax. Instead of writing a method invocation like

    ob'ekt = [[MyClass ajratmoq] init];    [ob'ekt firstLabel: param1 secondLabel: param2];

It was instead written as

    ob'ekt = (MyClass.ajratmoq).init;    ob'ekt.yorliqlar ( param1, param2 );

Similarly, declarations went from the form

    -(bekor) firstLabel: (int)param1 secondLabel: (int)param2;

ga

    -(bekor) yorliqlar ( int param1, int param2 );

This "modern" syntax is no longer supported in current dialects of the Objective-C language.

mulle-objc

The mulle-objc project is another re-implementation of Objective-C. Bu qo'llab-quvvatlaydi GCC yoki Jiringlash /LLVM compilers as backends. It diverges from other runtimes in terms of syntax, semantics and ABI compatibility. It supports Linux, FreeBSD, and Windows.

Portable Object Compiler

Bundan tashqari GCC /Keyingisi /olma implementation, which added several extensions to the original Qadam toshi implementation, another free, open-source Objective-C implementation called the Portable Object Compiler also exists.[50] The set of extensions implemented by the Portable Object Compiler differs from the GCC/NeXT/Apple implementation; in particular, it includes Kichik munozarasi -like blocks for Objective-C, while it lacks protocols and categories, two features used extensively in OpenStep and its derivatives and relatives. Overall, POC represents an older, pre-NeXT stage in the language's evolution, roughly conformant to Brad Cox's 1991 book.

It also includes a runtime library called ObjectPak, which is based on Cox's original ICPak101 library (which in turn derives from the Smalltalk-80 class library), and is quite radically different from the OpenStep FoundationKit.

GEOS Objective-C

The PC GEOS system used a programming language known as GEOS Objective-C yoki goc;[51] despite the name similarity, the two languages are similar only in overall concept and the use of keywords prefixed with an @ sign.

Jiringlash

The Jiringlash compiler suite, part of the LLVM project, implements Objective-C and other languages. After GCC 4.3 (2008) switched to GPLv3, Apple abandoned it in favor of clang, a compiler it has more legal power to modify. As a result, many of the modern Objective-C language features are supported only by Clang.

Apple's versioning scheme for its clang-based "LLVM compiler" differs from the LLVM's open-source versioning. Qarang XCode § Toolchain versions for a translation[43]

GNU, GNUstep, and WinObjC

The GNU project has, for a long time, been interested in a platform to port NeXT and Obj-C programs to. The ChangeLog for the libobjc directory in GCC suggests that it existed before 1998 (GCC 2.95), and its README further points at a rewrite in 1993 (GCC 2.4).[52]

The NeXT frontend source code was released since it was made as part of GCC, released GNU jamoat litsenziyasi which forces ones making derivative works to do so.[qachon? ] Apple continued this tradition in releasing its fork of GCC up to 4.2.1, after which they abandoned the compiler. GCC maintainers took in the changes, but did not invest much in supporting newer features such as the Objective-C 2.0 language.[32](Which compiler)

The GNUstep developers, interested in the new language, forked the GCC libobjc to a project independent of GCC called libobjc2 in 2009. They also arranged for the runtime to be used with Clang to take advantage of the new language syntax.[32](Which compiler) GCC moved slowly at the same time, but at GCC 4.6.0 (2011) they have moved on to Objective-C 2.0 in their libobjc as well.[31][53] GNUstep documentation suggest that the GCC implementation still lacks support for blocks, non-fragile variables, and the newer ARC.[32](Which runtime)

Microsoft vilkalar libobjc2 into a part of WinObjC, the iOS bridge for Universal Windows platformasi, in 2015. Combined with its own implementation of Kakao teginish and underlying APIs, the project allows the reuse of iOS Application code inside of UWP apps.[54]

On Windows, Objective-C Development tools are provided for download on GNUStep's website. The GNUStep Development System consists of the following packages: GNUstep MSYS System, GNUstep Core, GNUstep Devel, GNUstep Cairo, ProjectCenter IDE (Like Xcode, but not as complex), Gorm (Interface Builder Like Xcode NIB builder). These binary installers have not been updated since 2016,[55] so it could be a better idea to just install by building under Kigvin yoki MSYS2 o'rniga.

Library use

Objective-C today is often used in tandem with a fixed library of standard objects (often known as a "kit" or "framework"), such as Kakao, GNUstep yoki ObjFW. These libraries often come with the operating system: the GNUstep libraries often come with Linux -based distributions and Cocoa comes with macOS. The programmer is not forced to inherit functionality from the existing base class (NSObject / OFObject). Objective-C allows for the declaration of new root classes that do not inherit any existing functionality. Originally, Objective-C-based programming environments typically offered an Object class as the base class from which almost all other classes inherited. With the introduction of OpenStep, NeXT created a new base class named NSObject, which offered additional features over Object (an emphasis on using object references and reference counting instead of raw pointers, for example). Almost all classes in Cocoa inherit from NSObject.

Not only did the renaming serve to differentiate the new default behavior of classes within the OpenStep API, but it allowed code that used Object—the original base class used on NeXTSTEP (and, more or less, other Objective-C class libraries)—to co-exist in the same runtime with code that used NSObject (with some limitations). The introduction of the two letter prefix also became a simplistic form of namespaces, which Objective-C lacks. Using a prefix to create an informal packaging identifier became an informal coding standard in the Objective-C community, and continues to this day.

More recently, package managers have started appearing, such as CocoaPods, which aims to be both a package manager and a repository of packages. A lot of open-source Objective-C code that was written in the last few years can now be installed using CocoaPods.

Analysis of the language

Objective-C implementations use a thin ish vaqti tizimi written in C[iqtibos kerak ], which adds little to the size of the application. In contrast, most object-oriented systems at the time that it was created used large virtual mashina runtimes. Programs written in Objective-C tend to be not much larger than the size of their code and that of the libraries (which generally do not need to be included in the software distribution), in contrast to Smalltalk systems where a large amount of memory was used just to open a window. Objective-C applications tend to be larger than similar C or C++ applications because Objective-C dynamic typing does not allow methods to be stripped or inlined. Since the programmer has such freedom to delegate, forward calls, build selectors on the fly, and pass them to the runtime system, the Objective-C compiler cannot assume it is safe to remove unused methods or to inline calls.

Likewise, the language can be implemented atop extant C compilers (in GCC, first as a preprocessor, then as a module) rather than as a new compiler. This allows Objective-C to leverage the huge existing collection of C code, libraries, tools, etc. Existing C libraries can be wrapped in Objective-C o'rash to provide an OO-style interface. In this aspect, it is similar to GObject kutubxona va Vala language, which are widely used in development of GTK ilovalar.

All of these practical changes lowered the barrier to entry, likely the biggest problem for the widespread acceptance of Smalltalk in the 1980s.

A common criticism is that Objective-C does not have language support for ism maydonlari. Instead, programmers are forced to add prefixes to their class names, which are traditionally shorter than namespace names and thus more prone to collisions. As of 2007, all macOS classes and functions in the Kakao programming environment are prefixed with "NS" (e.g. NSObject, NSButton) to identify them as belonging to the macOS or iOS core; the "NS" derives from the names of the classes as defined during the development of Keyingi qadam.

Since Objective-C is a strict superset of C, it does not treat C primitive types as birinchi darajali ob'ektlar.

Aksincha C ++, Objective-C does not support operatorning ortiqcha yuklanishi. Also unlike C++, Objective-C allows an object to directly inherit only from one class (forbidding multiple inheritance ). However, in most cases, categories and protocols may be used as alternative ways to achieve the same results.

Because Objective-C uses dynamic runtime typing and because all method calls are function calls (or, in some cases, syscalls), many common performance optimizations cannot be applied to Objective-C methods (for example: inlining, constant propagation, interprocedural optimizations, and scalar replacement of aggregates). This limits the performance of Objective-C abstractions relative to similar abstractions in languages such as C++ where such optimizations are possible.

Xotirani boshqarish

The first versions of Objective-C did not support axlat yig'ish. At the time this decision was a matter of some debate, and many people considered long "dead times" (when Smalltalk performed collection) to render the entire system unusable. Some 3rd party implementations have added this feature (most notably GNUstep using Boem ), and Apple has implemented it as of Mac OS X v10.5.[56] However, in more recent versions of macOS and iOS, garbage collection has been deprecated in favor of Avtomatik ma'lumotni hisoblash (ARC), introduced in 2011.

With ARC, the compiler inserts retain and release calls automatically into Objective-C code based on statik kodni tahlil qilish. The automation relieves the programmer of having to write in memory management code. ARC also adds weak references to the Objective-C language.[57]

Philosophical differences between Objective-C and C++

The design and implementation of C ++ and Objective-C represent fundamentally different approaches to extending C.

In addition to C's style of procedural programming, C++ directly supports certain forms of ob'ektga yo'naltirilgan dasturlash, umumiy dasturlash va metaprogramma. C++ also comes with a large standard library shu jumladan several container classes. Similarly, Objective-C adds ob'ektga yo'naltirilgan dasturlash, dinamik yozish va aks ettirish to C. Objective-C does not provide a standard library o'z-o'zidan, but in most places where Objective-C is used, it is used with an OpenStep -like library such as OPENSTEP, Kakao, yoki GNUstep, which provides functionality similar to C++'s standard library.

One notable difference is that Objective-C provides runtime support for aks ettiruvchi features, whereas C++ adds only a small amount of runtime support to C. In Objective-C, an object can be queried about its own properties, e.g., whether it will respond to a certain message. In C++, this is not possible without the use of external libraries.

The use of reflection is part of the wider distinction between dynamic (run-time) features and static (compile-time) features of a language. Although Objective-C and C++ each employ a mix of both features, Objective-C is decidedly geared toward run-time decisions while C++ is geared toward compile-time decisions. The tension between dynamic and static programming involves many of the classic trade-offs in programming: dynamic features add flexibility, static features add speed and type checking.

Umumiy dasturlash and metaprogramming can be implemented in both languages using runtime polymorphism. In C++ this takes the form of virtual funktsiyalar va runtime type identification, while Objective-C offers dynamic typing and reflection. Both Objective-C and C++ support compile-time polymorphism (umumiy funktsiyalar ), with Objective-C only adding this feature in 2015.

Shuningdek qarang

Adabiyotlar

  1. ^ "Runtime Versions and Platforms". Developer.apple.com. Arxivlandi asl nusxasidan 2016 yil 20 iyuldagi. Olingan 24 dekabr, 2017.
  2. ^ Lattner, Chris (June 3, 2014). "Kris Lattnerning bosh sahifasi". Chris Lattner. Arxivlandi from the original on June 4, 2014. Olingan 3 iyun, 2014. Swift tili - bu til mutaxassilari jamoasi, hujjatlar bo'yicha mutaxassislar, kompilyatorni optimallashtirish ninjalari va g'oyalarni takomillashtirish va jangovar sinovlarga yordam berish uchun fikr-mulohazalarni taqdim etgan juda muhim ichki sinxronizatsiya guruhining tinimsiz mehnati samarasidir. Albatta, bu sohadagi boshqa ko'plab tillarda erishilgan tajribalardan, ob'ektiv-C, Rust, Haskell, Ruby, Python, C #, CLU va boshqa ro'yxatlash uchun juda ko'p fikrlardan foydalangan holda katta foyda oldi.
  3. ^ "App Frameworks". Olma. 2014 yil iyun. Arxivlandi asl nusxasidan 2019 yil 16 fevralda. Olingan 13 fevral, 2019.
  4. ^ Singh, Amit (December 2003). "Mac OS X ning qisqacha tarixi". Mac OS X Internals. Arxivlandi asl nusxasidan 2012 yil 14 mayda. Olingan 11 iyun, 2012.
  5. ^ Garling, Caleb. "iPhone Coding Language Now World's Third Most Popular". Simli. Arxivlandi asl nusxasidan 2013 yil 9 sentyabrda. Olingan 20 may, 2013.
  6. ^ Wentk, Richard (2009). Cocoa: Volume 5 of Developer Reference Apple Developer Series. John Wiley va Sons. ISBN  978-0-470-49589-6. Arxivlandi asl nusxasidan 2017 yil 16 fevralda. Olingan 22 iyul, 2016.
  7. ^ Byankuzzi, Federiko; Warden, Sheyn (2009). Dasturlashtirish ustalari. O'Reilly Media, Inc. pp. 242–246. ISBN  978-0-596-51517-1. Arxivlandi asl nusxasidan 2017 yil 17 fevralda. Olingan 22 iyul, 2016.
  8. ^ Cox, Brad (1983). "The object oriented pre-compiler: programming Smalltalk 80 methods in C language". ACM SIGPLAN xabarnomalari. Nyu-York, Nyu-York: ACM. 18 (1). doi:10.1145/948093.948095. S2CID  6975032. Olingan 17 fevral, 2011.
  9. ^ "Common Lisp and Readline". Arxivlandi asl nusxasidan 2014 yil 6 sentyabrda. Olingan 15 sentyabr, 2014. The issue first arose when NeXT proposed to distribute a modified GCC in two parts and let the user link them. Jobs asked me whether this was lawful. It seemed to me at the time that it was, following reasoning like what you are using; but since the result was very undesirable for free software, I said I would have to ask the lawyer. What the lawyer said surprised me; he said that judges would consider such schemes to be "subterfuges" and would be very harsh toward them. He said a judge would ask whether it is "really" one program, rather than how it is labeled. So I went back to Jobs and said we believed his plan was not allowed by the GPL. The direct result of this is that we now have an Objective C front end. They had wanted to distribute the Objective C parser as a separate proprietary package to link with the GCC back end, but since I didn't agree this was allowed, they made it free.
  10. ^ "GNUstep: Introduction". GNUstep developers/GNU Project. Arxivlandi asl nusxasidan 2012 yil 6 avgustda. Olingan 29 iyul, 2012.
  11. ^ "Kresten Krab Thorup | LinkedIn". www.linkedin.com. Arxivlandi asl nusxasidan 2014 yil 15 iyulda. Olingan 23 iyun, 2016.
  12. ^ "Write Objective-C Code". apple.com. 2013 yil 23 aprel. Arxivlandi asl nusxasidan 2013 yil 24 dekabrda. Olingan 22 dekabr, 2013.
  13. ^ "Objective-C Boot Camp". Arxivlandi asl nusxasidan 2018 yil 11 fevralda. Olingan 11 fevral, 2018. Objective-C is a strict superset of ANSI C
  14. ^ "Examining Objective-C". Arxivlandi asl nusxasidan 2014 yil 4 sentyabrda. Olingan 4 sentyabr, 2014. Objective-C is an object-oriented strict superset of C
  15. ^ Lee, Keith (September 3, 2013). Pro Objective-C. Apress. ISBN  9781430250500. Arxivlandi asl nusxasidan 2018 yil 14 mayda. Olingan 24 dekabr, 2017 - Google Books orqali.
  16. ^ "Tags for Objective-C Headers". Arxivlandi asl nusxasidan 2017 yil 1 aprelda. Olingan 11 fevral, 2018. Objective-C is a superset of C
  17. ^ "AppScan Source 8.7 now available". Arxivlandi asl nusxasidan 2017 yil 3 fevralda. Olingan 11 fevral, 2018. The Objective-C programming language is a superset of the C programming language
  18. ^ Apple, Inc. (2009 yil 19 oktyabr). "Dynamic Method Resolution". Objective-C Runtime Programming Guide. Arxivlandi asl nusxasidan 2010 yil 7 sentyabrda. Olingan 25-noyabr, 2014.
  19. ^ Apple, Inc. (2009 yil 19 oktyabr). "Avoiding Messaging Errors". The Objective-C Programming Language. Arxivlandi asl nusxasi on September 8, 2010.
  20. ^ "objc_msgSend - Objective-C Runtime". Apple Developer Documentation. Olingan 10 fevral, 2020.
  21. ^ "Messaging with the GNU Objective-C runtime". Using the GNU Compiler Collection (GCC). Olingan 10 fevral, 2020.
  22. ^ "Toifasi". Apple Developer (Cocoa Core Competencies).
  23. ^ Dalrymple, Mark; Knaster, Scott (June 27, 2012). Learn Objective-C on the Mac. p. 9. ISBN  9781430241881. The .m extension originally stood for "messages" when Objective-C was first introduced, referring to a central feature of Objective-C
  24. ^ "Objective-C Runtime Programming Guide". Apple Inc. Arxivlandi asl nusxasidan 2014 yil 4 aprelda. Olingan 21 oktyabr, 2013.
  25. ^ "ACM SIGGRAPH 1983 Issue 8 - Smalltalk". Arxivlandi asl nusxasi 2009 yil 15 aprelda. Olingan 7 oktyabr 2008.
  26. ^ "Extension Methods (C# Programming Guide)". Microsoft. 2010 yil oktyabr. Arxivlandi 2011 yil 11 iyuldagi asl nusxasidan. Olingan 10-iyul, 2011.
  27. ^ "Using C++ With Objective-C". Mac OS X Reference Library. Arxivlandi asl nusxasi 2010 yil 5 sentyabrda. Olingan 10 fevral, 2010.
  28. ^ "Clang Language Extensions — Clang 3.5 documentation". Clang.llvm.org. Arxivlandi asl nusxasidan 2014 yil 24 fevralda. Olingan 16 aprel, 2014.
  29. ^ "Objective-C 2.0: more clues". Lists.apple.com. August 10, 2006. Archived from asl nusxasi 2009 yil 18 iyunda. Olingan 30 may, 2010.
  30. ^ "Re: Objective-C 2.0". Lists.apple.com. Arxivlandi asl nusxasi 2010 yil 24 noyabrda. Olingan 30 may, 2010.
  31. ^ a b "GCC 4.6 Release Series — Changes, New Features, and Fixes : GNU Project : Free Software Foundation". Gcc.gnu.org. Arxivlandi asl nusxasidan 2018 yil 5 yanvarda. Olingan 24 dekabr, 2017.
  32. ^ a b v d "ObjC2 FAQ". GNUstep. Olingan 6 yanvar, 2020.
  33. ^ "Source Browser: objc4, 756.2". Apple Open Source. Olingan 6 yanvar, 2020.
  34. ^ Garbage Collection Programming Guide: Garbage Collection API Arxivlandi June 5, 2012, at Veb-sayt (Apple developer website - search for "__strong")
  35. ^ "Garbage Collection Programming Guide: Introduction to Garbage Collection". Apple Inc. October 3, 2011. Arxivlandi asl nusxasidan 2012 yil 5 iyunda. Olingan 23 dekabr, 2011.
  36. ^ "Leopard Technology Series for Developers: Objective-C 2.0 Overview". Apple Inc. November 6, 2007. Archived from asl nusxasi 2010 yil 24 iyulda. Olingan 30 may, 2010.
  37. ^ "Transitioning to ARC Release Notes". Apple Inc.2012 yil 17-iyul. Arxivlandi asl nusxasidan 2012 yil 5 iyunda. Olingan 26 avgust, 2012.
  38. ^ Mayk Esh. "Juma kuni savol-javob 2013-09-27: ARM64 va siz". mikeash.com. Arxivlandi asl nusxasidan 2014 yil 26 aprelda. Olingan 27 aprel, 2014.
  39. ^ "Hamster Emporium: [objc tushuntirish]: ko'rsatgich bo'lmagan isa". Sealiesoftware.com. 2013 yil 24 sentyabr. Arxivlandi asl nusxasidan 2014 yil 3 iyunda. Olingan 27 aprel, 2014.
  40. ^ Apple, Inc. (2009). "Tez ro'yxatga olish". apple.com. Arxivlandi asl nusxasidan 2009 yil 17 dekabrda. Olingan 31 dekabr, 2009.
  41. ^ Free Software Foundation, Inc. (2011). "GCC 4.6 chiqarilish seriyasi - o'zgartirishlar, yangi xususiyatlar va tuzatishlar". Gcc.gnu.org. Arxivlandi asl nusxasidan 2013 yil 2 dekabrda. Olingan 27-noyabr, 2013.
  42. ^ "Bloklarni dasturlash mavzulari - Mac Developer Library". Apple Inc. 2011 yil 8 mart. Arxivlandi asl nusxasidan 2012 yil 5 iyunda. Olingan 28-noyabr, 2012.
  43. ^ a b "Ob'ektiv-C avtomatik ma'lumotni hisoblash (ARC) - Clang 11 hujjatlari". Clang hujjatlari. Olingan 20 fevral, 2020. Hozircha ushbu hujjatni yagona amalga oshirilish versiyasi (va uning asosiy loyihasi) tomonidan jaranglash yo'li bilan tahrir qilish maqsadga muvofiqdir. "LLVM X.Y" LLVM loyihasidan jarangning ochiq manbali chiqarilishini anglatadi. "Apple X.Y" Apple tomonidan taqdim etilgan Apple LLVM Compiler-ning chiqarilishini anglatadi.
  44. ^ "ARC ga o'tish". Apple Inc. Arxivlandi asl nusxasidan 2011 yil 7 sentyabrda. Olingan 8 oktyabr, 2012.
  45. ^ "LLVM 3.0 versiyasi to'g'risida eslatmalar". releases.llvm.org.
  46. ^ a b "Objective-C yordamida dasturlash: qadriyatlar va to'plamlar". Apple Inc. Arxivlandi asl nusxasidan 2011 yil 7 sentyabrda. Olingan 8 oktyabr, 2012.
  47. ^ "Clang 3.1 chiqarilish eslatmalari". releases.llvm.org.
  48. ^ "Objective-C Literals - Clang 3.5 hujjatlari". Clang.llvm.org. Arxivlandi asl nusxasidan 2014 yil 6 iyunda. Olingan 16 aprel, 2014.
  49. ^ Rapsodiyani ishlab chiquvchilar uchun qo'llanma, AP Professional, 1997, 76-84 betlar
  50. ^ "Portativ ob'ektlar kompilyatori". Foydalanuvchilar.pandora.be. 1970 yil 1-yanvar. Arxivlandi asl nusxasidan 2008 yil 2 avgustda. Olingan 30 may, 2010.
  51. ^ "Breadbox Computer Company LLC bosh sahifasi". Arxivlandi asl nusxasi 2011 yil 27 iyulda. Olingan 8 dekabr, 2010.
  52. ^ "gcc / libobjc". GitHub. gcc-mirror. 2020 yil 6-yanvar. Olingan 6 yanvar, 2020. u ish vaqti gcc 2.4 da to'liq qayta yozilgan. Avvalgi ish vaqti bir nechta jiddiy xatolarga ega edi va juda to'liq emas edi.
  53. ^ "GNU Objective-C ish vaqti APIsi". GCC-dan foydalanish. Olingan 6 yanvar, 2020.
  54. ^ "GitHub-da WinObjC". Arxivlandi asl nusxasidan 2017 yil 2 dekabrda. Olingan 13 fevral, 2018.
  55. ^ "GNUStep Installer". Arxivlandi asl nusxasidan 2018 yil 17 fevralda. Olingan 14 fevral, 2018.
  56. ^ Apple, Inc. (2006 yil 22-avgust). "Mac OS X Leopard - Xcode 3.0". apple.com. Arxivlandi asl nusxasi 2007 yil 24 oktyabrda. Olingan 22 avgust, 2006.
  57. ^ "ARC Release Notes-ga o'tish". iOS ishlab chiqaruvchisi kutubxonasi. Developer.apple.com. Arxivlandi asl nusxasidan 2011 yil 7 sentyabrda. Olingan 16 aprel, 2014.

Qo'shimcha o'qish

  • Koks, Bred J. (1991). Ob'ektga yo'naltirilgan dasturlash: evolyutsion yondashuv. Addison Uesli. ISBN  0-201-54834-8.

Tashqi havolalar