Seçici için argümanların tip isimlerini bulmanın birkaç yolu vardır. Örneğin bu kod çalışır:
Method method = class_getInstanceMethod([self class], @selector(someMethod:param2:param3:));
char type[256];
int argsNumber = method_getNumberOfArguments(method);
for (int i = 0; i < argsNumber; i++) {
method_getArgumentType(method, i, type, 256);
NSLog(@"%s", type);
}
Birinci ve ikinci günlük argümanlar sistem vardır ve onlara ilgilenmiyor, bu yüzden başka bir ağaç hatları ihtiyacınız vardır.
da aşağıdaki kod örneğine
- (BOOL) someMethod:(NSString *)str param2:(UIView *)view param3:(NSInteger)number
{
return NO;
}
AMA için böyle uygulama olabilir aynı sonucu
NSMethodSignature *sig = [self methodSignatureForSelector:@selector(someMethod:param2:param3:)];
int args = [sig numberOfArguments];
for (int i = 0; i < args; i++) {
NSLog(@"%s", [sig getArgumentTypeAtIndex:i]);
}
someMethod:param2:param3:
verecektir! Nedeni biz büyük ama burada))) Her iki durumda da bir sembol uzunluğu ile const char *
dize ile argümanlar türleri isimleri olacaktır. Derleyici, here açıklandığı gibi tür adını kodlar. Int'ten farklı olabilir, ancak NSString'den UIView'yi değil. Tüm kimlik türleri için, '@' türüne sahip olacaksınız, yani id
. Acı ama gerçek. Ne yazık ki, tam bir tam ad veya kod çözme elde etmek için herhangi bir yol bulamadım. Bu şekilde bulacağınız takdirde lütfen bana bildirin.
Yani bu bir çözümdür. Bu yaklaşımı projenizde nasıl kullanacağınızı umuyoruz.
Aynı adı ve farklı parametre türlerini içeren iki yöntem bildiremezsiniz. –
Tamam, aynı yöntem adıyla, ancak farklı bağımsız değişken türleriyle farklı türde nesneler olduğunu varsayalım. Ne yaparsın peki? –
[Objective-C Runtime Functions] 'ı kullanmanız gerekecek (https://developer.apple.com/library/ios/#documentation/Cocoa/Reference/ObjCRuntimeRef/Reference/reference.html#//apple_ref/doc/ uid/TP40001418) doğrudan –