de-vraag
  • Pertanyaan
  • Tag
  • Pengguna
Notifikasi
Imbalan
Registrasi
Setelah Anda mendaftar, Anda akan diberitahu tentang balasan dan komentar untuk pertanyaan Anda.
Gabung
Jika Anda sudah memiliki akun, masuk untuk memeriksa pemberitahuan baru.
Akan ada hadiah untuk pertanyaan, jawaban, dan komentar tambahan.
Lebih
Sumber
Sunting
 罗泽轩
罗泽轩
Question

Kapan saya harus menggunakan @mensintesis secara eksplisit?

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?

69 2013-11-05T08:19:04+00:00 7
Alex Zavatone
Alex Zavatone
Pertanyaan edit 1 April 2015 в 5:59
Pemrograman
objective-c
properties
synthesize
Solution / Answer
Gabriele Petronella
Gabriele Petronella
6 November 2013 в 8:10
2013-11-06T20:10:52+00:00
Lebih
Sumber
Sunting
#22716300

Ada's banyak jawaban, tetapi juga sebuah kebingungan besar. I'll mencoba untuk menempatkan beberapa urutan (atau meningkatkan berantakan, we'll melihat...)

  1. 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.

  2. 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:

  • readwrite properti dengan custom getter dan setter

ketika memberikan baik getter dan setter penerapan khusus, properti won't dapat secara otomatis disintesis

  • readonly property dengan custom getter

ketika memberikan kustom pengambil implementasi untuk readonly property, ini tidak't dapat secara otomatis disintesis

  • @dinamis

ketika menggunakan @dinamis propertyName, properti won't dapat secara otomatis disintesis (cukup jelas, karena @dinamis dan @mensintesis adalah saling eksklusif)

  • sifat yang dinyatakan dalam @protokol

saat sesuai dengan protokol, setiap properti protokol mendefinisikan won't dapat secara otomatis disintesis

  • sifat yang dinyatakan dalam kategori

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.

  • ditimpa sifat (baru sejak dentang-600.0.51, pengiriman dengan Xcode 6, terima kasih Marc Schlüpmann)

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.

 Community
Community
Jawaban edit 23 Mei 2017 в 11:47
158
0
 KIDdAe
KIDdAe
5 November 2013 в 8:33
2013-11-05T08:33:51+00:00
Lebih
Sumber
Sunting
#22716296

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 !

 KIDdAe
KIDdAe
Jawaban edit 14 Oktober 2015 в 2:08
17
0
Steven Fisher
Steven Fisher
5 November 2013 в 5:42
2013-11-05T17:42:40+00:00
Lebih
Sumber
Sunting
#22716298

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:

  1. Mengubah properti's type, dan variabel instance's jenis perubahan.
  2. Mengubah penyimpanan kualifikasi (misalnya, membuatnya lemah, bukan yang kuat atau kuat, bukan lemah) dan penyimpanan kualifikasi perubahan.
  3. Menghapus atau mengubah properti, dan @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.

Steven Fisher
Steven Fisher
Jawaban edit 6 November 2013 в 8:23
11
0
 Fogmeister
Fogmeister
5 November 2013 в 5:47
2013-11-05T17:47:41+00:00
Lebih
Sumber
Sunting
#22716299

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.

Dan Rosenstark
Dan Rosenstark
Jawaban edit 20 Maret 2019 в 4:10
6
0
Leo  Natan--reinstate Monica
Leo Natan--reinstate Monica
6 November 2013 в 8:20
2013-11-06T20:20:08+00:00
Lebih
Sumber
Sunting
#22716301

Properti sintesis diperlukan ketika sebuah properti yang dinyatakan dalam protokol. Itu tidak akan secara otomatis disintesis dalam mengimplementasikan interface.

1
0
Harry McGovern
Harry McGovern
6 Mei 2014 в 3:41
2014-05-06T15:41:10+00:00
Lebih
Sumber
Sunting
#22716302

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.

0
0
Sam Fischer
Sam Fischer
5 November 2013 в 8:38
2013-11-05T08:38:36+00:00
Lebih
Sumber
Sunting
#22716297

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!

Sam Fischer
Sam Fischer
Jawaban edit 7 November 2013 в 3:19
-1
0
Tambahkan pertanyaan
Kategori
Semua
Teknologi
Budaya / Rekreasi
Kehidupan / Seni
Ilmu Pengetahuan
Profesional
Bisnis
Pengguna
Semua
Baru
Populer
1
Asilbek Qadamboyev
Terdaftar 6 jam yang lalu
2
Akshit Mehta
Terdaftar 2 hari yang lalu
3
me you
Terdaftar 5 hari yang lalu
4
Никита иванов
Terdaftar 1 minggu yang lalu
5
Alex1976G_06
Terdaftar 1 minggu yang lalu
ID
JA
KO
RU
© de-vraag 2022
Sumber
stackoverflow.com
di bawah lisensi cc by-sa 3.0 dengan atribusi