#class vs #import

Mənim fikrimcə, ClassA ClassB başlığını daxil edərkən birbaşa sinif bəyannaməsi istifadə olunmalı və ClassB hər hansı bir dövrəyə daxil edilməməsi üçün ClassA başlığını daxil etməlidir. Mən də anlayıram ki, #import sadə bir ifndef , belə ki, daxil olmaq yalnız bir dəfə daxil edilir.

Mənim sorğum: #import istifadə olunduqda və @class zaman istifadə olunur? Bəzən @class istifadə etsəniz, kompilyator haqqında ümumi bir xəbərdarlıq görürəm, məsələn aşağıdakılar:

warning: receiver 'FooController' is a forward class and corresponding @interface may not exist.

Bunu anlamaq çox gözəl olardı, sadəcə, @class irəli bəyanatın çıxarılması və tərtibçinin mənə verdiyi xəbərdarlıqları aradan qaldırmaq üçün @class elan #import .

681
27 нояб. Coocoo4Cocoa tərəfindən təyin edilmiş 27 noyabr. 2008-11-27 03:20 '08 saat 03:20 'da 2008-11-27 03:20
@ 15 cavab

Bu xəbərdarlığı görürsən:

xəbərdarlıq: alıcı "MyCoolClass" bir irəli sinifdir və müvafiq @ interface mövcud olmaya bilər

bir #import faylına ehtiyacınız var, ancaq bunu tətbiq faylınızda (.m) edə bilərsiniz və başlıq dosyanızda @class istifadə edə bilərsiniz.

@class , (adətən) #import faylları üçün #import aradan qaldırmaz, sadəcə məlumatın faydalı olduğu yerə bu tələbi daha da yaxınlaşdırır.

Misal

@class MyCoolClass , derleyici belə bir şey görə biləcəyini bilir:

 MyCoolClass *myObject; 

MyCoolClass , etibarlı bir sinifdən başqa hər hansı bir şey haqqında narahatlığa ehtiyacınız yoxdur və ona bir göstəricinin yerini MyCoolClass lazımdır (həqiqətən, bir göstərici). Beləliklə, @class başlığınızdakı @class 90% -i kifayətdir.

Lakin, myObject elementlərini yaratmaq və ya daxil olmaq üçün ehtiyacınız varsa, bu üsulların nə olduğunu derleyiciye bildirməlisiniz. Bu mərhələdə (ehtimal ki, tətbiq faylında) "bu bir sinif" istisna olmaqla, kompilyatora əlavə məlumatı bildirmək üçün #import "MyCoolClass.h" lazımdır.

724
27 нояб. 27 noyabrda Ben Gottlieb tərəfindən verilmiş cavab 2008-11-27 03:33 '08 at 03:33 2008-11-27 03:33

Üç sadə qaydalar:

  • Üstbilgi fayllarında ( .h ) yalnız #import superclass və qəbul protokolları.
  • #import bütün siniflər və protokolları ( .m ) dəstəkləyir.
  • Hər şey üçün başqa reklam göndərin.
border=0

Bəyannaməni tətbiq fayllarına göndərirsinizsə, yəqin ki, səhv edirsiniz.

171
29 авг. Cavab 29 avqustda PeyloW tərəfindən verilir . 2009-08-29 03:34 '09 at 3:34 pm 2009-08-29 03:34

ADC -də Objective-C proqramlaşdırma dilinin sənədlərinə baxın

"Class Interface Class Definition" bölməsində bunun nə üçün edildiyini izah edir:

@Class direktivi kompilyator və linker tərəfindən müşahidə olunan kodun məbləğini minimuma endirir və bu səbəbdən sinif adının birbaşa elan edilməsi üçün ən asan yoludur. Sadə olmaq, digər faylları idxal edən faylları idxal edərkən yarana biləcək potensial problemləri aradan qaldırır. Məsələn, bir sinif başqa bir sinifin statik olaraq yazılmış nümunə dəyişənini bildirir və onların iki interfeys bir-birlərini idxal edirsə, onlardan heç biri düzgün tərtib edilə bilməz.

Bu kömək edir.

106
27 нояб. Cavab Abizern 27 Noyabr. 2008-11-27 14:23 '08 at 14:23 2008-11-27 14:23

Lazım gələrsə #import istifadə etdiyiniz hər hansı bir sinif üçün başlıq faylında və #import başlıq fayllarında biçimlendirilmiş bir bildirimi istifadə edin. Başqa bir deyişlə, tətbiqinizdə istifadə #import faylları hər zaman #import və başlıq faylınızdakı bir sinifə istinad #import , irəli bəyannaməni də istifadə edin.

Bunun istisnası siz #import sinif və ya rəsmi bir protokole #import (bu halda #import üçün idxal etməyəcəksiniz).

47
27 нояб. Cavab Marc Charbonneau tərəfindən 27 noyabrda verilir . 2008-11-27 03:33 '08 at 03:33 2008-11-27 03:33

Digər bir üstünlük: sürətli tərtibat

Başlıq faylını daxil etsəniz, hər hansı bir dəyişiklik cari faylın tərtib olunmasına gətirib çıxarır, lakin sinif adı @class name klass adı kimi daxil @class name . Əlbəttə ki, başlığı mənbə faylına daxil etməlisiniz.

24
09 сент. cavab 09 avqustda verilir . 2010-09-09 11:02 '10 at 11:02 2010-09-09 11:02

Ümumi təcrübə başlıq fayllarında @ klassı istifadə etməkdir (lakin hələ də #import superklassinə ehtiyacınız var) və tətbiq fayllarında #import. Bu hər hansı bir dairəvi inklüzyondan qaçınılmaz və yalnız işləyir.

24
27 нояб. Cavab 27 noyabrda Steph Thirion tərəfindən verilir 2008-11-27 04:04 '08 at 04:04 2008-11-27 04:04

Mənim istəyim belədir. #İmport istifadə olunduqda və @class zaman nə vaxt istifadə olunur?

Sadə cavab: fiziki asılılıq olduğunda #import və ya #include #import . Əks halda, irəli bəyanatları istifadə @class MONClass ( @class MONClass , struct MONStruct , @protocol MONProtocol ).

Bəzi fiziki asılılıq nümunələri bunlardır:

  • Hər hansı bir C və ya C ++ dəyəri (pointer və ya link fiziki asılılıq deyil). CGPoint kimi CGPoint və ya bir əmlakınız varsa, derleyici CGPoint .
  • Sizin superclass.
  • Istifadə etdiyiniz üsul.

Bəzən @class bildirişini istifadə etsəniz, kompilyator haqqında ümumi bir xəbərdarlıq görürəm: "xəbərdarlıq:" FooController "qəbuledicisi bir irəli sinifdir və müvafiq @ ara sıra mövcud olmaya bilər."

Derleyici həqiqətən bu mövzuda çox yumşaqdır. Göstərişlər göstərilir (məsələn, yuxarıda), ancaq onları nəzərə #import düzgün şəkildə göstərilmirsinizsə yığını asanlıqla silə bilərsiniz. Buna baxmayaraq (IMO), kompilyator onu tətbiq etmir. ARC derleyicisi referans hesablama üçün məsuliyyət daşıyır, çünki daha çox məhduddur. Derivat, çağırdığınız bilinməyən bir metodla qarşılaşdıqda, default olaraq varsayılan olaraq geri döndüğünde ne olur. Hər qaytarma dəyəri və parametri id hesab edilir. Beləliklə, kodun əsaslarından bütün xəbərdarlıqları aradan qaldırmalısınız, çünki bu fiziki asılılıq hesab edilməlidir. Bu, elan edilməmiş C funksiyasını çağırmağa bənzəyir. C parametrləri int hesab edilir.

Öncəki bəyannamələrin üstünlük səbəbi, minimum vaxtdan asılılıq olduğundan, qurma vaxtını faktorlarla azalda bilər. Fikir bəyannamələrinin köməyi ilə derleyici, bir ad var olduğunu və heç bir fiziki asılılıq olmadığında sinif deklarasiyasını və ya bütün bağımlılıklarını görmədən proqramı düzgün bir şəkildə təhlil edə və tərtib edə bilir. Təmiz yığımlar daha az vaxt alır. Artımlı quruluşlar daha az vaxt alır. Əlbəttə ki, nəticədə hər bir tərcüməyə görə lazım olan bütün başlıqların görünməsi üçün bir az daha çox vaxt sərf edirsiniz, amma özünüz üçün aşağı salınma vaxtında (layihənin kiçik olmadığını nəzərə alaraq) tez bir şəkildə ödəyirsiniz.

Əgər #import və ya #include əvəzinə istifadə etsəniz, kompilyatorda zəruri olduğundan daha çox iş #import . Ayrıca kompleks başlıq bağımlılıklarına da girdiniz. Bunu kobud qüvvə alqoritmi ilə müqayisə edə bilərsiniz. # #import , bir çox yaddaş, disk I / O və prosessorları təhlil etmək və tərtib etmək üçün tələb olunan lazımsız məlumat #import sürükləyir və #import .

NSObject növləri heç vaxt dəyərlər olmadığı üçün ObjC asılılıq əsaslı C dilində ideal olduqca yaxındır - NSObject növləri həmişə sayılan göstəricilərə istinad edir. Beləliklə, asılı proqramlarınızı müvafiq olaraq qurarsanız və edə biləcəyiniz yerə getməyiniz olduqca sürətli kompilyasiya anları ilə üzləşə bilərsiniz, çünki çox az fiziki asılılığı tələb edir. Ayrıca bağımlılıkları daha da en aza indirmek üçün sınıf uzantıları özelliklerini de bildirə bilərsiniz. Bu, böyük sistemlər üçün böyük bir bonusdur - siz böyük bir C ++ kod bazasını inkişaf etdirdiyiniz təqdirdə fərqin nə olacağını bilirsiniz.

Buna görə mənim #import mümkün olduğu yerlərdə, daha sonra isə fiziki asılılıq olduğu yerdə #import üçün istifadə etməkdir. Bir xəbərdarlıq və ya fiziki asılılığı nəzərdə tutan başqa bir şey görürsənsə, hamısını düzəlt. Düzeltme, tətbiq faylınızda #import .

Kitabxanalar yaratdığınızda, ən çox ehtimal ki, bəzi interfeysləri bir qrup olaraq təsnif #import Bu halda fiziki asılılığın tətbiq edildiyi kitabxana (məsələn, #import <AppKit/AppKit.h> ) tətbiq olunacaq. Bu bağımlılıklara gətirib çıxara bilər, ancaq kitabxanalara dəstək verənlər fiziki asılılıqları sizin üçün lazımlı şəkildə idarə edə bilərlər - bir funksiyaya daxil olsalar, onlar quruluşlarınıza təsirini minimuma endirə bilərlər.

18
08 февр. Cavab sadəcə 08 fevral verilir. 2012-02-08 09:10 '12 saat 09:10 'da 2012-02-08 09:10

Mən çox şey görürəm "Mən də bunu edirəm", amma "Niyə?" Cavablarını görmürəm.

Beləliklə: Niyə başlığınızda @ class və yalnız tətbiqinizdə #import lazımdır? Hər dəfə @class və #import ilə işinizi iki dəfə artırın. Əgər mirasdan istifadə etmirsinizsə. Bu halda bir @class üçün bir neçə dəfə idxal olunacaqsınız. Birdən birdən reklama girişə ehtiyacınız olmadığı barədə qərar qəbul etsəniz, bir neçə müxtəlif fayldan silinməyi unutmayın.

Eyni faylın bir neçə dəfə idxal edilməsi #import təbiəti səbəbindən problem deyil. Performans tərtibi də problem deyil. Əgər belədirsə, biz demək olar ki, hər bir başlıq faylında Cocoa / Cocoa.h və ya kimi idxal etmək olmazdı.

11
29 июня '11 в 18:51 2011-06-29 18:51 cavabı 29 iyun 'da saat 18: 00-da Bruce Goodwin tərəfindən verilmişdir 2011-06-29 18:51

Bunu edəcəyik

 @interface Class_B : Class_A 

Class_B'de Class_A'yı devraldığımız anlamına gelir, Class_B'de sınıf_A'nın bütün değişkenlerine erişebiliriz.

əgər bunu edirik

 #import .... @class Class_A @interface Class_B 

burada biz Class_A proqramımızı istifadə etdiyimizi deyirik, lakin Class_B'de Class_A dəyişənləri istifadə etmək istəyirsinizsə, .m faylında #import Class_A (bir obyekt yaratmaq və funksiyası və dəyişənləri istifadə etmək) lazımdır.

7
04 янв. Cavab Anshuman Mişra tərəfindən verilir 04 Yan 2012-01-04 09:32 '12 at 9:32 2012-01-04 09:32

Fayl bağımlılıkları və #import və @ class haqqında daha ətraflı məlumat üçün bu səhifəni kontrol edin:

http://qualitycoding.org/file-dependencies/ itin yaxşı bir məqalə

məqalə xülasəsi

başlıq fayllarına idxal:

  • #import siz miras qaldıran devralınan üst səviyyə və çalışan olduğunuz protokollardır.
  • Başqa hər şeyi bildirin (əsas mövzu ilə çərçivədən çıxmasa).
  • Bütün başqa # imports aradan qaldırılması üçün cəhd edin.
  • Bağımlılıkları azaltmaq üçün öz başlıqlarında protokolları bildirin.
  • Çox çox qabaqcıl reklam? Böyük bir sinif var.

tətbiq fayllarına idxal:

  • İstifadə edilən aralıq kəməri # imports aradan qaldırın.
  • Metod başqa bir obyektə dəvət olunur və geri qaytarırsa, bu obyekti #importing əvəzinə göndərin-göndərin.
  • Bir modulu döndərsəniz ardıcıl asılılıq səviyyəsindən sonra səviyyəyə daxil etməyi məcbur edirsinizsə, bir kitabxana olmaq istəyən bir sıra dərsləriniz ola bilər. Üstün başlığı ilə ayrı bir kitabxana olaraq yaradın, hər şey bir hazır hazırlanmış parça kimi təqdim edilə bilər.
  • Çox çox sayda idxal? Böyük bir sinif var.
5
12 авг. Cavab verən cəmi 12 aug. 2013-08-12 14:16 '13 'da 14:16' da 2013-08-12 14:16

İnkişaf etdiyim zaman mənə heç bir problem getməyən üç şey var.

  • Superclass idxal
  • Ana uşağın idxalı (uşaqlarınız və valideynləriniz olduqda)
  • Layihə xaricində idxal dərsləri (məsələn, infrastruktur və kitabxanalarda)

Digər bütün siniflər üçün (alt siniflər və mənim özüm layihəmə daxil olan uşaq sinifləri) üçün onları irəli sinifdə bəyan edirəm.

3
18 мая '11 в 18:42 2011-05-18 18:42 Cavab Randy Marsh tərəfindən 18 May 'da 18:42' də verildi 2011-05-18 18:42

Başlıq dosyanızda hələ idxal etməmiş olduğunuz bir dəyişən və ya əmlak bildirmək istəyirsinizsə, kompilyatorun bu sinfi bilmədiyini söyləyən bir səhv mesajı alacaqsınız.

İlk #import yəqin ki, onu #import .
Bəzi hallarda bu problemlərə səbəb ola bilər.

Misal üçün, başlıq faylında və ya strukturlarda bir C üsulu tətbiq edərsənsə və ya belə bir şey varsa, çünki bir neçə dəfə idxal edə bilməzsiniz.

Buna görə də, @class deyə bilərsiniz:

Bilirsiniz ki, bu sinfi bilmirdiniz, ancaq mövcuddur. Başqa yerdə idxal və satılacaq.

Əsasən, kompüterin bu sinifin tətbiq olunacağına əmin olmasa belə, susdurmaq və tərtib etmək deməkdir.

Adətən, .m@class in .h fayllarında @class istifadə #import .

2
07 янв. NSAddict tərəfindən Jan 07 verdiyi cavab 2013-01-07 15:18 '13 saat 15:18 'da 2013-01-07 15:18

@ Klassa ehtiyacımız olduğu bir nümunə script.

Eyni sinifin data tipi ilə bir parmetre olan üstbilgi faylında bir protokol yaratmaq istəmədiyinizi düşünün, sonra @class istifadə edə bilərsiniz. Protokolları ayrı-ayrı elan edə biləcəyinizi xatırlayın, bu yalnız bir nümunədir.

 DroneSearchField.h #import <UIKit/UIKit.h> @class DroneSearchField; @protocol DroneSearchFieldDelegate<UITextFieldDelegate> @optional - (void)DroneTextFieldButtonClicked:(DroneSearchField *)textField; @end @interface DroneSearchField : UITextField @end 
0
27 сент. Sujananth Visvaratnam tərəfindən verilmiş cavab 27 Sep. 2016-09-27 16:33 '16 'da 16:33' də 2016-09-27 16:33

Kompilyator yalnız bu sinfi kompilyatorun həyata keçirilməsini bilməsi üçün istifadə edəcəyi təqdirdə şikayət edəcək.

Məsələn:

  • Sınıfınızdan çıxarmaq kimi görünən kimi görünə bilər
  • Əgər bu sinifin bir obyekti üzv dəyişən (nadir hal olsa da) kimi olacaq.

Yalnız bir göstərici olaraq istifadə edəcəyinizdən şikayətlənməyəcək. Əlbəttə ki, tətbiqin faylına bu idxal etmək lazımdır (əgər bu sinifin bir obyektinin nümunəsini yaratsanız), obyektin bir nümunəsi yaratmaq üçün sinifin məzmununu bilməlidir.

Qeyd. #import #include ilə eyni deyil. Bu, heç bir şeyin dairəvi idxal deyilməməsi deməkdir. idxal, bəzi məlumatlar üçün xüsusi bir faylın keçirilməsi üçün tərtib edilmiş bir növ tələbdir. Bu məlumat artıq mövcuddursa, kompilyator onu məhəl qoymur.

Yalnız cəhd edin, Bh və Bh əşya Ah daxil Ah heç bir problem və ya şikayət olmayacaq və bu da çox gözəl olacaq.

@ Klassı istifadə edərkən

Yalnız üstbilginizi üstbilginize aktarmak istemiyorsanız, @ klassını istifadə edirsiniz. Bu hətta bu sinifə nə gələcəyini bilməməyiniz lazım olsa belə ola bilər. Hələ bu sinif üçün bir başlıq yoxdur.

Bunun bir nümunəsidir ki, iki kitabxana yazırsınız. Bir sinif, onu bir zəng etməyə imkan verir, bir kitabxanada var. Bu kitabxana ikinci kitabxanadan bir mövzu daxildir. Bu başlıq A'ya göstərici ola bilər, ancaq onu istifadə etmək lazım olmaya bilər. Kitabxana 1-də hələ mövcud deyilsə, @class istifadə edərkən Kitabxana B bloklanmayacaqdır. Amma Ahı idxal etmək istəyirsənsə, kitabxana 2-nin gedişi engellenir.

0
18 июля '13 в 14:15 2013-07-18 14:15 Cavab Deepak GM tərəfindən 18 İyul '13 'də saat 14:15' də verilir. 2013-07-18 14:15

Bəyannaməni yalnız kompilyator tərtibinin qarşısını almaq üçün göndərin.

derivat başlıq dosyanızda istifadə etdiyiniz adla bəyannamə üçün bir sinif olduğunu bilir.

0
22 июня '12 в 18:12 2012-06-22 18:12 cavab 22 iyun 'da saat 18:12 ' də karthick tərəfindən verilir 2012-06-22 18:12

dair digər suallar və ya bir sual