Sejauh yang saya tahu, sejak XCode 4.4 @mensintesis
akan auto-menghasilkan properti accesor. Tapi sekarang aku telah membaca sampel kode tentang NSUndoManager
, dan dalam kode itu melihat bahwa @mensintesis
ditambahkan secara eksplisit. Seperti:
@interface RootViewController ()
@property (nonatomic, strong) NSDateFormatter *dateFormatter;
@property (nonatomic, strong) NSUndoManager *undoManager;
@end
@implementation RootViewController
//Must explicitly synthesize this
@synthesize undoManager;
Saya merasa bingung sekarang... Kapan saya harus menambahkan @mensintesis
secara eksplisit untuk kode saya?
Ada's banyak jawaban, tetapi juga sebuah kebingungan besar. I'll mencoba untuk menempatkan beberapa urutan (atau meningkatkan berantakan, we'll melihat...)
Let's berhenti berbicara tentang Xcode. Xcode adalah IDE. dentang adalah compiler. Fitur ini kita membahas ini disebut autosynthesis dari sifat dan's Objective-C ekstensi bahasa yang didukung oleh dentang, yang merupakan compiler default yang digunakan oleh Xcode.
Hanya untuk membuat jelas, jika anda beralih ke gcc dalam Xcode, anda memenangkan't mendapatkan keuntungan dari fitur ini (terlepas dari Xcode versi.) Dengan cara yang sama jika anda menggunakan editor teks dan mengkompilasi menggunakan dentang dari baris perintah, anda akan.
Terima kasih untuk autosynthesis anda don't perlu secara eksplisit mensintesis properti seperti itu akan secara otomatis disintesis oleh compiler sebagai
@mensintesis propertyName = _propertyName
Namun, ada beberapa pengecualian:
ketika memberikan baik getter dan setter penerapan khusus, properti won't dapat secara otomatis disintesis
ketika memberikan kustom pengambil implementasi untuk readonly property, ini tidak't dapat secara otomatis disintesis
ketika menggunakan @dinamis propertyName
, properti won't dapat secara otomatis disintesis (cukup jelas, karena @dinamis
dan @mensintesis
adalah saling eksklusif)
saat sesuai dengan protokol, setiap properti protokol mendefinisikan won't dapat secara otomatis disintesis
ini adalah kasus di mana @mensintesis
direktif tidak secara otomatis dimasukkan oleh compiler, tapi ini sifat yang tidak dapat disintesis secara manual baik. Sementara kategori yang dapat menyatakan sifat-sifatnya, mereka tidak dapat disintesis di semua, karena kategori yang tidak dapat membuat ivars. Demi kelengkapan, I'll menambahkan bahwa's's masih mungkin untuk palsu tamu sintesis menggunakan Objective-C runtime.
ketika anda mengganti properti dari sebuah superclass, anda harus secara eksplisit mensintesis
It's dicatat bahwa sintesis properti secara otomatis mensintesis dukungan ivar, jadi jika properti sintesis hilang, ivar akan hilang juga, kecuali dinyatakan dengan jelas.
Kecuali untuk terakhir tiga kasus, filsafat umum adalah bahwa setiap kali anda secara manual menentukan semua informasi tentang properti (dengan menerapkan semua metode pengakses atau menggunakan @dinamis
) kompiler akan menganggap anda ingin kontrol penuh atas tamu dan akan menonaktifkan autosynthesis di atasnya.
Terlepas dari kasus-kasus yang terdaftar di atas hanya menggunakan eksplisit @mensintesis
akan menentukan nama ivar. Namun konvensi yang penting, jadi saran saya adalah untuk selalu menggunakan standar penamaan.
Jika anda tidak secara eksplisit menggunakan @mensintesis
compiler akan mengerti properti anda dengan cara yang sama jika anda telah menulis
@synthesize undoManager=_undoManager;
maka anda akan mampu menulis dalam kode anda hal-hal seperti :
[_undoManager doSomething]; // iVar
[self.undoManager doSomethingElse]; // Use generated getter
Ini adalah konvensi umum.
jika anda menulis
@synthesize undoManager;
anda akan memiliki :
[undoManager doSomething]; // iVar
[self.undoManager doSomethingElse]; // Use generated getter
Secara pribadi saya berhenti menggunakan @mensintesis
, sejak itu's tidak wajib lagi.
Bagi saya satu-satunya alasan untuk menggunakan @mensintesis
adalah untuk link iVar
ke @property
. Jika anda ingin membuat spesifik getter dan setter untuk itu.
Tapi di bagian tertentu dari kode tidak ada iVar
, saya berpikir bahwa ini @mensintesis
adalah sia-sia. Tapi sekarang saya pikir pertanyaan baru "Kapan harus menggunakan iVar
?", dan I've tidak ada respon lainnya dari "tidak" untuk yang satu ini !
Ketika saya harus menambahkan @mensintesis
secara eksplisit untuk kode saya?
Umumnya, jika itu's yang dibutuhkan: Anda mungkin tidak akan pernah memukul sebuah kasus di mana itu's diperlukan.
Ada's satu hal yang anda mungkin menemukan itu berguna, meskipun.
Katakanlah anda're tulisan kedua kustom getter dan setter, tetapi ingin contoh variabel untuk kembali itu. (Untuk atom properti, ini adalah yang sederhana seperti ingin custom setter: compiler akan menulis pengambil jika anda menentukan setter untuk monoatomik properti, tetapi tidak sebuah atom tamu.)
Pertimbangkan ini:
@interface MyObject:NSObject
@property (copy) NSString *title;
@end
@implementation MyObject
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Ini tidak akan bekerja, karena _title
doesn't ada. Anda've ditentukan para pengambil atau setter, jadi Xcode (benar) doesn't membuat backing variabel instance untuk itu.
Anda memiliki dua pilihan untuk membuatnya ada. Anda dapat mengubah @implementasi
ini:
@implementation MyObject {
NSString *_title;
}
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Atau mengubahnya ke yang ini:
@implementation MyObject
@synthesize title = _title;
- (NSString *)title {
return _title;
}
- (void)setTitle:(NSString *)title {
_title = [title copy];
}
@end
Dengan kata lain, meskipun mensintesis adalah untuk tujuan praktis tidak perlu*, dapat digunakan untuk mendefinisikan properti-backing variabel misalnya ketika anda're mudah getter/setter. Anda dapat memutuskan yang membentuk di sini yang ingin anda gunakan.
Di masa lalu, saya've disukai menentukan variabel instance di @implementasi {}
, tapi sekarang saya pikir @mensintesis
route adalah pilihan yang lebih baik karena menghilangkan berlebihan tipe dan secara eksplisit hubungan dukungan variabel properti:
@mensintesis
akan menghasilkan kesalahan kompiler. Anda memenangkan't berakhir dengan nyasar contoh variabel.*-Aku tahu satu kasus di mana hal itu diperlukan, berkaitan dengan pemisahan fungsi di kategori dalam beberapa file. Dan saya tidak't heran jika Apple perbaikan ini, atau bahkan sudah memiliki.
OK, ketika anda membuat properti...
@property NSString *name;
Xcode akan otomatis mensintesis sebuah iVar seolah-olah anda telah menulis...
@synthesize name = _name;
Ini berarti anda dapat mengakses properti dengan...
self.name;
// or
_name;
Baik akan bekerja tapi hanya diri.nama
benar-benar menggunakan metode pengakses.
Hanya ada satu waktu yang auto mensintesis tidak bekerja: Jika anda menimpa tapi setter DAN getter maka anda akan perlu untuk mensintesis iVar.
Anda baik-baik saja jika anda hanya menimpa setter atau jika anda hanya menimpa getter. Tapi jika anda melakukan keduanya maka compiler tidak't memahami hal ini dan anda akan perlu untuk mensintesis secara manual.
Sebagai aturan praktis sekalipun.
Don't membuat iVars. Hanya menggunakan properti. Don't mensintesis.
Terima kasih untuk mengklarifikasi itu. Saya punya masalah yang sama.
@synthesize firstAsset, secondAsset, audioAsset;
@synthesize activityView;
Jadi sekarang, setelah berkomentar mereka keluar, aku pergi melalui dan diganti setiap kejadian dengan, misalnya
mandiri.firstAsset tampaknya saya juga bisa menggunakan firstAsset, tapi aku menemukan aku rindu melihat "" terlalu sering.
Xcode doesn't membutuhkan eksplisit @mensintesis
deklarasi.
Jika anda don't menulis @mensintesis
yang sama dengan melakukan :
@synthesize manager = _manager;
Contoh kode might've telah tua. Mereka'll update segera.
Anda dapat mengakses properti anda seperti :
[self.manager function];
Ini adalah Apple's direkomendasikan konvensi. Saya ikuti, dan saya sarankan bahwa anda lakukan juga!