Jawaban:
Anda tidak dapat mendeklarasikan metode dilindungi atau pribadi. Sifat dinamis Objective-C membuatnya tidak mungkin untuk mengimplementasikan kontrol akses untuk metode. (Anda dapat melakukannya dengan banyak memodifikasi kompiler atau runtime, dengan penalti kecepatan yang parah, tetapi untuk alasan yang jelas hal ini tidak dilakukan.)
Diambil dari Sumber .
Anda dapat menyimulasikan akses yang dilindungi dan privat ke metode dengan melakukan hal berikut:
Perlindungan ini, seperti yang dicatat Sachin, tidak diberlakukan pada waktu proses (seperti yang ada di Java, misalnya).
UIGestureRecognizerSubclass.h
Inilah yang saya lakukan untuk membuat metode terlindungi terlihat oleh subkelas saya, tanpa mengharuskan mereka untuk menerapkan metode itu sendiri. Ini berarti saya tidak mendapatkan peringatan compiler di subclass saya tentang implementasi yang tidak lengkap.
SuperClassProtectedMethods.h (file protokol):
@protocol SuperClassProtectedMethods <NSObject>
- (void) protectMethod:(NSObject *)foo;
@end
@interface SuperClass (ProtectedMethods) < SuperClassProtectedMethods >
@end
SuperClass.m: (compiler sekarang akan memaksa Anda untuk menambahkan metode yang dilindungi)
#import "SuperClassProtectedMethods.h"
@implementation SuperClass
- (void) protectedMethod:(NSObject *)foo {}
@end
SubKelas.m:
#import "SuperClassProtectedMethods.h"
// Subclass can now call the protected methods, but no external classes importing .h files will be able to see the protected methods.
performSelector
melakukannya.
[(id)obj hiddenMethod]
. Tepatnya, metode yang dilindungi tidak didukung di Objective-C.
Saya baru saja menemukan ini dan itu berhasil untuk saya. Untuk memperbaiki jawaban Adam, dalam superclass Anda membuat implementasi metode yang dilindungi dalam file .m tetapi jangan mendeklarasikannya dalam file .h. Dalam subkelas Anda, buat kategori baru di file .m Anda dengan deklarasi metode superkelas yang dilindungi dan Anda dapat menggunakan metode kelas super yang dilindungi di subkelas Anda. Ini pada akhirnya tidak akan mencegah pemanggil dari metode yang seharusnya dilindungi jika dipaksa pada waktu proses.
/////// SuperClass.h
@interface SuperClass
@end
/////// SuperClass.m
@implementation SuperClass
- (void) protectedMethod
{}
@end
/////// SubClass.h
@interface SubClass : SuperClass
@end
/////// SubClass.m
@interface SubClass (Protected)
- (void) protectedMethod ;
@end
@implementation SubClass
- (void) callerOfProtectedMethod
{
[self protectedMethod] ; // this will not generate warning
}
@end
protectedMethod
Cara lain menggunakan variabel @protected.
@interface SuperClass:NSObject{
@protected
SEL protectedMehodSelector;
}
- (void) hackIt;
@end
@implementation SuperClass
-(id)init{
self = [super init];
if(self) {
protectedMethodSelector = @selector(baseHandling);
}
return self;
}
- (void) baseHandling {
// execute your code here
}
-(void) hackIt {
[self performSelector: protectedMethodSelector];
}
@end
@interface SubClass:SuperClass
@end
@implementation SubClass
-(id)init{
self = [super init];
if(self) {
protectedMethodSelector = @selector(customHandling);
}
return self;
}
- (void) customHandling {
// execute your custom code here
}
@end
Anda bisa mendefinisikan metode sebagai metode privat dari kelas induk dan bisa digunakan [super performSelector:@selector(privateMethod)];
di kelas anak.
Anda dapat semacam melakukan hal ini dengan kategori.
@interface SomeClass (Protected)
-(void)doMadProtectedThings;
@end
@implementation SomeClass (Protected)
- (void)doMadProtectedThings{
NSLog(@"As long as the .h isn't imported into a class of completely different family, these methods will never be seen. You have to import this header into the subclasses of the super instance though.");
}
@end
Metode tidak disembunyikan jika Anda mengimpor kategori di kelas lain, tetapi Anda tidak melakukannya. Karena sifat dinamis Objective-C, sebenarnya tidak mungkin untuk menyembunyikan metode sepenuhnya terlepas dari jenis instance pemanggil.
Cara terbaik untuk melakukannya mungkin adalah kategori kelanjutan kelas seperti yang dijawab oleh @Brian Westphal tetapi Anda harus mendefinisikan ulang metode dalam kategori ini untuk setiap instance subclass.
Salah satu opsinya adalah menggunakan ekstensi kelas untuk menyembunyikan metode.
Masuk .h
:
@interface SomeAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
Masuk .m
:
@interface SomeAppDelegate()
- (void)localMethod;
@end
@implementation SomeAppDelegate
- (void)localMethod
{
}
@end
@interface
deklarasi dalam file .m. Anda bisa mendeklarasikan fungsi dan menggunakannya dan itu akan diperlakukan sebagai privat.