Sejak mulai mengerjakan aplikasi iOS dan objektif C, saya benar-benar bingung dengan lokasi berbeda di mana seseorang dapat mendeklarasikan dan menentukan variabel. Di satu sisi kami memiliki pendekatan C tradisional, di sisi lain kami memiliki arahan ObjectiveC baru yang menambahkan OO di atasnya. Bisakah kalian membantu saya memahami praktik terbaik dan situasi di mana saya ingin menggunakan lokasi ini untuk variabel saya dan mungkin memperbaiki pemahaman saya saat ini?
Berikut adalah contoh kelas (.h dan .m):
#import <Foundation/Foundation.h>
// 1) What do I declare here?
@interface SampleClass : NSObject
{
// 2) ivar declarations
// Pretty much never used?
}
// 3) class-specific method / property declarations
@end
dan
#import "SampleClass.h"
// 4) what goes here?
@interface SampleClass()
// 5) private interface, can define private methods and properties here
@end
@implementation SampleClass
{
// 6) define ivars
}
// 7) define methods and synthesize properties from both public and private
// interfaces
@end
- Pemahaman saya tentang 1 dan 4 adalah bahwa itu adalah deklarasi dan definisi berbasis file gaya-C yang tidak memiliki pemahaman apa pun tentang konsep kelas, dan dengan demikian harus digunakan dengan tepat bagaimana mereka akan digunakan di C. Saya telah melihatnya digunakan untuk menerapkan lajang berbasis variabel statis sebelumnya. Apakah ada kegunaan praktis lain yang saya lewatkan?
- Saya mengambil dari bekerja dengan iOS adalah bahwa ivar telah sepenuhnya dihapus di luar direktif @synthesize dan dengan demikian sebagian besar dapat diabaikan. Apakah itu masalahnya?
- Mengenai 5: mengapa saya ingin mendeklarasikan metode dalam antarmuka pribadi? Metode kelas privat saya tampaknya dapat dikompilasi dengan baik tanpa deklarasi di antarmuka. Apakah sebagian besar untuk keterbacaan?
Terima kasih banyak, teman-teman!
sumber
Pertama, baca jawaban @ DrummerB. Ini adalah gambaran umum yang baik tentang mengapa dan apa yang biasanya harus Anda lakukan. Dengan mengingat hal itu, untuk pertanyaan spesifik Anda:
Tidak ada definisi variabel aktual di sini (secara teknis legal untuk melakukannya jika Anda tahu persis apa yang Anda lakukan, tetapi tidak pernah melakukan ini). Anda dapat mendefinisikan beberapa jenis hal lain:
Eksternal terlihat seperti deklarasi variabel, tetapi itu hanya janji untuk benar-benar mendeklarasikannya di tempat lain. Di ObjC, mereka hanya boleh digunakan untuk mendeklarasikan konstanta, dan umumnya hanya konstanta string. Misalnya:
Anda kemudian akan
.m
mendeklarasikan konstanta aktual di file Anda :Seperti dicatat oleh DrummerB, ini adalah warisan. Jangan taruh apapun di sini.
Ya.
Konstanta eksternal, seperti dijelaskan di atas. File variabel statis juga dapat masuk ke sini. Ini setara dengan variabel kelas dalam bahasa lain.
Ya
Tapi sangat jarang. Hampir selalu Anda harus mengizinkan clang (Xcode) membuat variabel untuk Anda. Pengecualian biasanya ada di sekitar ivars non-ObjC (seperti objek Core Foundation, dan terutama objek C ++ jika ini adalah kelas ObjC ++), atau ivar yang memiliki semantik penyimpanan aneh (seperti ivars yang tidak cocok dengan properti karena alasan tertentu).
Umumnya Anda tidak boleh @sintesis lagi. Clang (Xcode) akan melakukannya untuk Anda, dan Anda harus membiarkannya.
Selama beberapa tahun terakhir, banyak hal menjadi lebih sederhana secara dramatis. Efek sampingnya adalah sekarang ada tiga era yang berbeda (ABI Fragile, ABI Non-rapuh, Non-fragile ABI + sintesis otomatis). Jadi, ketika Anda melihat kode yang lebih lama, itu bisa sedikit membingungkan. Dengan demikian kebingungan yang timbul dari kesederhanaan: D
sumber
Saya juga cukup baru, jadi semoga saya tidak mengacaukan apa pun.
1 & 4: Variabel global gaya-C: mereka memiliki cakupan file yang luas. Perbedaan antara keduanya adalah, karena lebar file, yang pertama akan tersedia bagi siapa saja yang mengimpor header sedangkan yang kedua tidak.
2: variabel instan. Sebagian besar variabel instance disintesis dan diambil / disetel melalui pengakses menggunakan properti karena hal itu membuat manajemen memori bagus dan sederhana, serta memberi Anda notasi titik yang mudah dipahami.
6: Penerapan ivars agak baru. Ini adalah tempat yang baik untuk meletakkan ivar pribadi, karena Anda hanya ingin mengekspos apa yang dibutuhkan di header publik, tetapi subclass tidak mewarisinya AFAIK.
3 & 7: Metode publik dan deklarasi properti, lalu implementasi.
5: Antarmuka pribadi. Saya selalu menggunakan antarmuka pribadi kapan pun saya bisa untuk menjaga kebersihan dan menciptakan semacam efek kotak hitam. Jika mereka tidak perlu mengetahuinya, taruh di sana. Saya juga melakukannya agar terbaca, tidak tahu apakah ada alasan lain.
sumber
Ini adalah contoh dari semua jenis variabel yang dideklarasikan di Objective-C. Nama variabel menunjukkan aksesnya.
File: Animal.h
File: Animal.m
Perhatikan bahwa variabel iNotVisible tidak terlihat dari kelas lain. Ini adalah masalah visibilitas, jadi nyatakan dengan
@property
atau@public
tidak mengubahnya.Di dalam konstruktor, praktik yang baik adalah mengakses variabel yang dideklarasikan dengan
@property
menggunakan garis bawah sebagai gantinyaself
untuk menghindari efek samping.Mari kita coba mengakses variabel.
File: Cow.h
File: Cow.m
Kami masih dapat mengakses variabel yang tidak terlihat menggunakan runtime.
File: Cow.m (bagian 2)
Mari kita coba mengakses variabel yang tidak terlihat.
File: main.m
Ini cetakan
Perhatikan bahwa saya dapat mengakses backing ivar
_iNotVisible2
yang bersifat pribadi untuk subclass. Di Objective-C semua variabel dapat dibaca atau disetel, bahkan yang diberi tanda@private
, tanpa pengecualian.Saya tidak menyertakan objek terkait atau variabel C karena mereka adalah burung yang berbeda. Adapun variabel C, variabel apa pun yang ditentukan di luar
@interface X{}
atau@implementation X{}
merupakan variabel C dengan ruang lingkup file dan penyimpanan statis.Saya tidak membahas atribut manajemen memori, atau atribut readonly / readwrite, getter / setter.
sumber