Yanıtlar:
Korunan veya özel bir yöntemi de bildiremezsiniz . Objective-C'nin dinamik yapısı, yöntemler için erişim kontrollerinin uygulanmasını imkansız kılar. (Bunu, ciddi bir hız cezası ile derleyiciyi veya çalışma zamanını büyük ölçüde değiştirerek yapabilirsiniz, ancak bariz nedenlerden dolayı bu yapılmaz.)
Kaynaktan Alındı .
Aşağıdakileri yaparak yöntemlere korumalı ve özel erişimi simüle edebilirsiniz :
Bu korumalar, Sachin'in belirttiği gibi, çalışma zamanında uygulanmaz (örneğin Java'da olduğu gibi).
UIGestureRecognizerSubclass.h
Yöntemleri kendilerinin uygulamalarını gerektirmeden, alt sınıflarım tarafından görünür hale getirmek için yaptığım şey şu. Bu, alt sınıfımda eksik bir uygulamaya sahip olma konusunda derleyici uyarıları almadığım anlamına geliyordu.
SuperClassProtectedMethods.h (protokol dosyası):
@protocol SuperClassProtectedMethods <NSObject>
- (void) protectMethod:(NSObject *)foo;
@end
@interface SuperClass (ProtectedMethods) < SuperClassProtectedMethods >
@end
SuperClass.m: (derleyici şimdi sizi korumalı yöntemler eklemeye zorlayacaktır)
#import "SuperClassProtectedMethods.h"
@implementation SuperClass
- (void) protectedMethod:(NSObject *)foo {}
@end
SubClass.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.
[(id)obj hiddenMethod]. Doğru söylemek gerekirse, korumalı yöntem Objective-C'de desteklenmez.
Bunu yeni keşfettim ve benim için işe yarıyor. Adam'ın cevabını geliştirmek için, üst sınıfınızda korumalı yöntemin .m dosyasında bir uygulamasını yapın, ancak bunu .h dosyasında bildirmeyin. Alt sınıfınızda, üst sınıfın korumalı yönteminin bildirimi ile .m dosyanızda yeni bir kategori oluşturun ve alt sınıfınızdaki üst sınıfın korumalı yöntemini kullanabilirsiniz. Bu, çalışma zamanında zorlanırsa, sözde korumalı yöntemi arayan kişiyi nihai olarak engellemeyecektir.
/////// 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
@ Korumalı değişkenleri kullanmanın başka bir yolu.
@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
Yöntemi, ana sınıfın özel bir yöntemi olarak tanımlayabilir [super performSelector:@selector(privateMethod)];ve alt sınıfta kullanabilirsiniz.
Şunları yapabilirsiniz çeşit bir kategori ile yapıyoruz.
@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
Kategoriyi başka bir sınıfa aktarırsanız yöntemler gizlenmez, ancak bunu yapmazsınız. Objective-C'nin dinamik doğası nedeniyle, çağıran örnek türünden bağımsız olarak bir yöntemi tamamen gizlemek aslında imkansızdır.
Gitmenin en iyi yolu muhtemelen @ Brian Westphalia tarafından yanıtlanan sınıf devam kategorisidir, ancak bu kategorideki yöntemi her bir alt sınıf örneği için yeniden tanımlamanız gerekir.
Bir seçenek, sınıf uzantısı kullanmaktırYöntemlerden yöntemleri gizlemek .
İçinde .h:
@interface SomeAppDelegate : UIResponder <UIApplicationDelegate>
@property (strong, nonatomic) UIWindow *window;
@end
İçinde .m:
@interface SomeAppDelegate()
- (void)localMethod;
@end
@implementation SomeAppDelegate
- (void)localMethod
{
}
@end
@interface.M dosyasındaki beyana ihtiyacınız olduğunu bile sanmıyorum . Sadece bir fonksiyon tanımlayabilir ve onu kullanabilirsiniz ve özel olarak kabul edilecektir.