2013-02-06 64 views
2

我想創建一個我想使用該類的屬性名稱和屬性值序列化爲XML的類。對於我創造了我的基類中的下列功能(從我會得到我的所有其他類):EXC_BAD_ACCESS訪問屬性時的異常

- (NSString*) serialize 
{ 
    unsigned int outCount, i; 
    NSMutableString* s = [NSMutableString string]; 

    Class currentClass = [self class]; 
    while(currentClass != nil) { 
     objc_property_t *properties = class_copyPropertyList([self class], &outCount); 
     if(outCount > 0) { 
      for(i = 0; i < outCount; i++) { 
       objc_property_t property = properties[i]; 
       NSString *name = [NSString stringWithCString: property_getName(property) encoding: NSUTF8StringEncoding]; 
       [s appendFormat: @"<%@>%@</%@>", name, (NSString*)property, name]; 
      } 
     } 
     free(properties); 
    } 
    return (NSString*)s; 
} 

@end 

我假設所有屬性是(非原子,強)的NSString *(現在 - 一個更復雜的代碼會在稍後發佈)。現在由於某種原因,當我上線

[s appendFormat: @"<%@>%@</%@>", name, (NSString*)property], name]; 

我得到一個EXC_BAD_ACCESS異常。 我在做什麼錯? 在此先感謝!

+0

你的意思是[s appendFormat:@「<%@>%@」,name,(NSString *)property,name]; not [s appendFormat:@「<%@>%@」,name,(NSString *)property],name];對 ? – msk

+0

@MSK,對!修復它在原來的問題。 – PeterD

回答

0

找到它了。只需使用

   NSString *value = [self valueForKey:name]; 

來獲得屬性值...

0

屬性返回爲c字符串,而不是NSString。只是改變你的格式打印出一個C字符串,而不是試圖轉換它,像這樣:

  [s appendFormat: @"<%@>%s</%@>", name, property, name]; 
+0

HM,這不會拋出,但不會做我所需要的,那就是獲得財產的價值。我認爲這個問題是這個objc_property_t真的是一個不透明的類型,因爲它在這裏說:http://stackoverflow.com/a/7336129/1959008。我需要弄清楚如何獲得實際值,然後將其轉換爲NSString – PeterD

0

當您使用%@與對象,編譯器基本上是試圖通過調用該對象的描述方法來幫助你。您的objc_property_t變量不支持該方法。我認爲它實際上是一個結構......你不能只是將它轉換成NSString。您需要決定要打印的屬性,然後從中檢索該值。與您使用property_getName檢索「name」屬性的操作類似。

+0

是的,謝謝! – PeterD