Saya telah melihat penggunaan protokol Objective-C digunakan dengan cara seperti berikut:
@protocol MyProtocol <NSObject>
@required
@property (readonly) NSString *title;
@optional
- (void) someMethod;
@end
Saya telah melihat format ini digunakan alih-alih menulis superclass beton yang diperluas subclass. Pertanyaannya adalah, jika Anda mematuhi protokol ini, apakah Anda perlu mensintesis properti sendiri? Jika Anda memperpanjang superclass, jawabannya jelas tidak, Anda tidak perlu melakukannya. Tetapi bagaimana seseorang berurusan dengan properti yang harus dipenuhi oleh suatu protokol?
Untuk pemahaman saya, Anda masih perlu mendeklarasikan variabel instan dalam file header objek yang sesuai dengan protokol yang membutuhkan properti ini. Dalam hal itu, dapatkah kita berasumsi bahwa itu hanya prinsip panduan? Jelas sama bukan kasus untuk metode yang diperlukan. Kompiler akan menampar pergelangan tangan Anda untuk mengecualikan metode yang diperlukan yang tercantum dalam protokol. Apa cerita di balik properti?
Berikut adalah contoh yang menghasilkan kesalahan kompilasi (Catatan: Saya telah memangkas kode yang tidak mencerminkan masalah yang dihadapi):
MyProtocol.h
@protocol MyProtocol <NSObject>
@required
@property (nonatomic, retain) id anObject;
@optional
TestProtocolsViewController.h
- (void)iDoCoolStuff;
@end
#import <MyProtocol.h>
@interface TestProtocolsViewController : UIViewController <MyProtocol> {
}
@end
TestProtocolsViewController.m
#import "TestProtocolsViewController.h"
@implementation TestProtocolsViewController
@synthesize anObject; // anObject doesn't exist, even though we conform to MyProtocol.
- (void)dealloc {
[anObject release]; //anObject doesn't exist, even though we conform to MyProtocol.
[super dealloc];
}
@end
sumber
Inilah contoh milik saya yang bekerja dengan sempurna, definisi protokol pertama-tama:
Di bawah ini adalah contoh kerja dari kelas yang mendukung protokol ini:
sumber
yang harus Anda lakukan adalah menjatuhkan a
dalam implementasi Anda dan Anda harus siap. ini bekerja dengan cara yang sama seperti menempatkan properti di antarmuka kelas Anda.
Edit:
Anda mungkin ingin melakukan ini lebih spesifik:
Ini akan sejalan dengan bagaimana sintesis otomatis xcode menciptakan properti dan ivars jika Anda menggunakan sintesis otomatis, sehingga jika kelas Anda memiliki properti dari protokol dan kelas, beberapa ivars Anda tidak akan memiliki format berbeda yang dapat berdampak keterbacaan.
sumber
synthesize
sudah cukup. Keren!Lihatlah artikel saya PROPERTI DALAM PROTOKOL
Misalkan saya memiliki MyProtocol yang mendeklarasikan properti nama, dan MyClass yang sesuai dengan protokol ini
Hal-hal yang patut dicatat
Saya tidak dapat mendeklarasikan ulang properti nama ini, karena sudah dinyatakan oleh protokol. Lakukan ini akan berteriak kesalahan
Cara menggunakan properti dalam protokol
Jadi untuk menggunakan MyClass dengan properti nama itu, kita harus melakukan keduanya
Nyatakan properti itu lagi (AppDelegate.h melakukannya dengan cara ini)
Mensintesiskan diri kita sendiri
sumber
Contoh: 2 kelas (Orang dan Serial) ingin menggunakan layanan Viewer ... dan harus sesuai dengan ViewerProtocol. viewerTypeOfDescription adalah kelas pelanggan properti wajib harus sesuai.
Contoh lain dengan pewarisan Protokol atas subklasifikasi
sumber
Variabel, anObject, perlu didefinisikan dalam definisi kelas TestProtocolsViewController Anda, protokol hanya memberi tahu Anda bahwa itu harus ada di sana.
Kesalahan kompiler mengatakan yang sebenarnya - variabel tidak ada. @ properti sama sekali hanya pembantu.
sumber