Setelah membaca sebuah artikel dengan rendah hati bernama "Perintah Kode: Praktik Terbaik untuk Pengodean Objective-C" oleh Robert McNally sedikit kurang dari dua tahun yang lalu, saya mengadopsi praktik menggunakan properti untuk hampir setiap anggota data kelas Objective-C saya ( perintah ke 3 pada Mei 2012). McNally mencantumkan alasan ini untuk melakukan hal itu (penekanan saya):
- Properti memberlakukan pembatasan akses (seperti hanya baca)
- Properti menegakkan kebijakan manajemen memori (kuat, lemah)
- Properti memberikan peluang untuk mengimplementasikan setter dan pengambil kustom secara transparan.
- Properti dengan setter atau pengambil kustom dapat digunakan untuk menegakkan strategi keselamatan ulir.
- Memiliki satu cara untuk mengakses variabel instan meningkatkan pembacaan kode.
Saya menempatkan sebagian besar properti saya dalam kategori pribadi, jadi nomor 1 dan 4 biasanya bukan masalah yang saya hadapi. Argumen 3 dan 5 lebih 'lunak', dan dengan alat yang tepat dan konsistensi lainnya mereka bisa menjadi non-isu. Jadi akhirnya, bagi saya argumen yang paling berpengaruh adalah nomor 2, manajemen memori. Saya sudah melakukan ini sejak itu.
@property (nonatomic, strong) id object; // Properties became my friends.
Untuk beberapa proyek terakhir saya, saya telah beralih menggunakan ARC, yang membuat saya ragu apakah membuat properti untuk hampir semua hal masih merupakan ide bagus atau mungkin sedikit berlebihan. ARC menangani memori yang mengelola objek Objective-C untuk saya, yang bagi sebagian besar strong
anggota berfungsi dengan baik jika Anda hanya mendeklarasikan ivars. Tipe C yang harus Anda kelola secara manual, sebelum dan sesudah ARC, dan weak
propertinya kebanyakan milik publik.
Tentu saja saya masih menggunakan properti untuk apa pun yang membutuhkan akses dari luar kelas, tetapi kebanyakan hanya segelintir properti, sementara sebagian besar anggota data terdaftar sebagai ivars di bawah header implementasi
@implementation GTWeekViewController
{
UILongPressGestureRecognizer *_pressRecognizer;
GTPagingGestureRecognizer *_pagingRecognizer;
UITapGestureRecognizer *_tapRecognizer;
}
Sebagai percobaan saya telah melakukan ini sedikit lebih ketat, dan pindah dari properti untuk semuanya memiliki beberapa efek samping positif yang bagus.
- Persyaratan kode anggota data (
@property
/@synthesize
) menyusut menjadi hanya deklarasi ivar. - Sebagian besar
self.something
referensi saya dibersihkan hingga adil_something
. - Sangat mudah dibedakan mana data anggota yang bersifat pribadi (ivar) dan mana yang bersifat publik (properti).
- Terakhir, rasanya 'lebih seperti ini adalah tujuan dari properti yang dimaksudkan Apple, tapi itu spekulasi subyektif.
Pada pertanyaan : Saya perlahan-lahan meluncur ke sisi gelap, menggunakan lebih sedikit dan lebih sedikit properti yang mendukung implementasi-ivars. Dapatkah Anda memberi saya sedikit alasan mengapa saya harus tetap menggunakan properti untuk semuanya, atau mengkonfirmasi pemikiran saya saat ini tentang mengapa saya harus menggunakan lebih banyak ivars dan lebih sedikit properti hanya jika diperlukan? Jawaban paling persuasif untuk kedua belah pihak akan menerima nilai saya.
EDIT: McNally menimbang di Twitter, mengatakan : "Saya pikir alasan utama saya untuk tetap menggunakan properti adalah: satu cara untuk melakukan segalanya, itu melakukan segalanya (termasuk KVC / KVO.)"