2009-12-11 15 views
6

GüncelleştirmeMark 'un önerisini uygulayarak geçersiz kılınan yöntemlerin çoğaltılmasını ve özellik veya yöntemin oluşturucusunun izini ortadan kaldırmak için kodu düzelttim. Henüz mülk türleri ele alınmamış (muhtemelen, property_getAttributes() ile başladığım zaman). Ayrıca, körelmiş alt çizgilerden arındırılmış.Nesne-C'de bir sınıfı nasıl denetlerim?


Temelde yöntemleri ve özellikleri miras ağacın aşağı tüm yol atlamalı olmadan belirli bir nesne üzerinde mevcut olduğunu kendime hatırlatmak için bir yol gerekir.

aşağıdaki fonksiyonunu pişirdim ama istenen biraz bırakır:

#import <objc/runtime.h> 

NSInteger inspectClass_alphabeticSort(id string1, id string2, void *reverse) 
{ 
    if ((NSInteger *)reverse == NO) 
    { 
     return [string2 localizedCaseInsensitiveCompare:string1]; 
    } 
    return [string1 localizedCaseInsensitiveCompare:string2]; 
} 

void inspectClassStopAt(Class inspectedClass, Class stopClass) 
{ 
    Class originalClass    = inspectedClass; 
    NSString *originalClassString = [NSString stringWithFormat:@"%@", originalClass]; 
    NSString *inheritancePath  = [NSString stringWithFormat:@"%@", originalClass]; 

    Method *methods; 
    objc_property_t *properties; 
    unsigned int i; 
    unsigned int methodCount; 
    unsigned int propertyCount; 
    int reverseSort = NO; 

    NSArray *sorted; 
    NSArray *methodsAndPropertiesKeys; 
    NSMutableDictionary * methodsAndProperties = [NSMutableDictionary dictionaryWithCapacity:10]; 

    NSString *inspectedClassString; 
    NSString *methodOrPropertyName; 
    while (inspectedClass != stopClass) 
    { 
     inspectedClassString = [NSString stringWithFormat:@"%@", inspectedClass]; 
     if (inspectedClass != originalClass) 
     { 
      inheritancePath = [inheritancePath stringByAppendingFormat:@" : %@", inspectedClass]; 
     } 

     methods  = class_copyMethodList(inspectedClass, &methodCount); 
     properties = class_copyPropertyList(inspectedClass, &propertyCount); 

     for (i=0; i<methodCount; i++) 
     { 
      methodOrPropertyName = [NSString stringWithFormat:@"-%s", sel_getName(method_getName(methods[i]))]; 

      if (![methodsAndProperties objectForKey:methodOrPropertyName]) 
      { 
       [methodsAndProperties setObject:inspectedClassString forKey:methodOrPropertyName]; 
      } 
     } 

     for (i=0; i<propertyCount; i++) 
     { 
      methodOrPropertyName = [NSString stringWithFormat:@" %s", property_getName(properties[i])]; 

      if (![methodsAndProperties objectForKey:methodOrPropertyName]) 
      { 
       [methodsAndProperties setObject:inspectedClassString forKey:methodOrPropertyName]; 
      } 
     } 

     inspectedClass = [inspectedClass superclass]; 
    } 
    free(methods); 
    free(properties); 

    methodsAndPropertiesKeys = [methodsAndProperties allKeys]; 
    sorted = [methodsAndPropertiesKeys sortedArrayUsingFunction:inspectClass_alphabeticSort context:&reverseSort]; 

    NSLog(@"%@", inheritancePath); 
    for (NSString *key in sorted) 
    { 
     if (![[methodsAndProperties objectForKey:key] isEqualToString:originalClassString]) 
     { 
      NSLog(@"\t%@ (%@)", key, [methodsAndProperties objectForKey:key]); 
     } 
     else 
     { 
      NSLog(@"\t%@", key); 
     } 
    } 
} 

void inspectClass(Class inspectedClass) 
{ 
    inspectClassStopAt(inspectedClass, [NSObject class]); 
} 

Ve inspectClass([TextMap class]); bazı örnek çıktı:

TextMap : Surface 
    position (Surface) 
    size (Surface) 
    -addChild: (Surface) 
    -dealloc 
    -init (Surface) 
    -initWithFile: 
    -position (Surface) 
    -render 
    -setPosition: (Surface) 
    -setSize: (Surface) 
    -setText: 
    -size (Surface) 
    -update (Surface) 
+0

Bunun için kullanım durumu nedir? Hata ayıklayıcı konsolda yararlı olduğunu görebiliyordum, bunun dışında aynı bilgileri almak için kod tamamlama işlemini yapabilirsiniz. –

+0

Hala Objective-C için nispeten yeniyim, bu yüzden yinelemiyorum. Çok. Kodu iyileştirmek veya yeniden kodlamak değil, sadece işe almak için. Özellikler ve yöntem imzaları orijinal beklentilerimden ve tasarımdan çok şey değiştiriyor. Net bir resmi bir araya getirmek için üç veya dört kaynak dosyaya vurmak zorunda kalmadan bir sınıfa ait geçerli imzayı atmak güzel olurdu. NSObject'den miras alınan tüm spesifik olmayan yöntemler ve özellikler nedeniyle kod tamamlama benim için çalışmaz. –

+0

Bu sorunun cevabının soruda olduğu anlaşılıyor! İyi iş. Bu bana bir ton yardımcı oldu. – levous

cevap

1

bir NSMutableDictionary olduğunu gerekenler gibi görünüyor , seçici isimlere yazılmıştır. Her seçicinin adını bir anahtar olarak, sınıf adı ile değer olarak ekleyin. Yinelenenleri ortadan kaldırmak için bir seçici eklemeden önce sözlükte arama yapabilirsiniz.

2

runtime.h ile sağlanan c kütüphaneleri için güzel bir yardımcı/sarmalayıcı Sadece bunu kullanmaya başladım https://github.com/mikeash/MAObjCRuntime

ama kesinlikle umut verici görünüyor. Kullanım durumuyla ilgili olarak, benimki sadece bir nesne grafiğine eklenebilen bir kendinden kablolama UI oluşturmak için bir denetçi sağlamaktır. Bu olası çift kod azaltma bir sürü var.

İlgili konular