2011-01-07 25 views
1

我有一個表視圖控制器,並在其初始化過程中設置了一個NSArray屬性,然後在cellForRowAtIndexPath方法中使用該屬性來顯示錶上的數據。調用保留屬性時,TableViewController會崩潰嗎?

但是,當我觸摸一排,一旦我把這個保留的NSArray屬性稱爲EXC_BAD_ACCESS!

FYI的屬性被定義爲如下所示,並使用自定義getter函數:

@property (nonatomic,retain) NSArray *dataList; 

並在.m文件:

@synthesize dataList; 

- (NSArray *)dataList 
{ 
    if (!dataList) 
    { 
     NSString *p = [kind lowercaseString]; 
     NSString *s = [[NSBundle mainBundle] pathForResource:p ofType:@"txt"]; 
     NSLog(@"%@",s); 

     NSData *dataRep = [NSData dataWithContentsOfFile:s]; 
     NSPropertyListFormat format; 
     dataList = [NSPropertyListSerialization propertyListFromData: dataRep 
                mutabilityOption: NSPropertyListImmutable 
                   format: &format 
                errorDescription: nil]; 
     if (dataList.count == 0) 
      NSLog(@"Fetch failed!"); 
    } 

    return dataList; 
} 

任何建議?

+0

你可以發佈更多的代碼?比如你的自定義getter函數? – GendoIkari

+0

你需要在這裏發佈更多的代碼。要麼你有一個重寫的getter/setter,或者你錯誤地處理了其他地方的數組保留計數。 –

+0

您可能也希望將其轉換爲複製屬性。這意味着如果您將一個NSMutableArray分配給該屬性,然後對該數組進行變異,則該數組的屬性版本將不會發生變異。如果你指定一個不可變的NSArray,那麼這個副本就像保留一樣。 –

回答

3

這就是問題:

dataList = [NSPropertyListSerialization propertyListFromData ... 

此功能不與alloccopy,或retain開始,因此它返回一個自動釋放物體。但是,您需要保留它以保持它。

你有兩個選擇:

self.dataList = [NSPropertyListSerialization propertyListFromData ... 

,或者

dataList = [[NSPropertyListSerialization propertyListFromData ...] retain]; 
+0

感謝您的回覆。我完全理解你的觀點,儘管沒有那些工作=(我想我會在設置時通過將它的值複製到另一個NSArray來解決它。我的一個很好的問題,調用之間有什麼區別:myProperty和self.myProperty? – nosuic

+0

這是重要部分的一部分,'myProperty'直接訪問實例變量*,而'self.myProperty'正在經歷合成(或自定義)getter/setter方法,特別是當你使用'@property(retain)'和'@ synthesize',用'self.myProperty = ...'賦值並自動保留這個對象,然而,在你的自定義方法中,你直接分配一個自動釋放對象實例變量,您需要先保留它。 – jtbandes

相關問題