2012-08-26 80 views
0

在下面的代碼中,我試圖將對象添加到數組。沒有錯誤,但不添加對象。對不起,問這個非常基本的問題。需要幫助添加對象到數組時遇到問題

的NS對象定義
//DataDefinition.h #進口

@interface DataDefinition : NSObject 
@property (nonatomic, retain) NSString *dataHeader; 
@property (nonatomic, retain) NSMutableArray *dataDetails; 

@end 

的DataDefinition實現

#import "DataDefinition.h" 
@implementation DataDefinition 

@synthesize dataHeader; 
@synthesize dataDetails; 

@end 

的顯示錶頭部分 //DataDisplay.h #進口

#import "DataDefinition.h" 

@interface DataDisplay : UITableViewController 
@property (strong, nonatomic) NSMutableArray *dataSet; 
@property (strong, atomic) DataDefinition *individualData; 

@end 

顯示屏實現部分

//DataDisplay.m 
#import "DataDisplay.h" 

@interface DataDisplay() 
@end 

@implementation DataDisplay 
@synthesize dataSet; 
@synthesize individualData; 

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 

    individualData.dataHeader = @"Header1"; 
    individualData.dataDetails = [[NSMutableArray alloc] initWithObjects:@"Header1-Detail1", @"Header1-Detail2", @"Header1-Detail3", nil]; 

    //This didnot add 
    [dataSet addObject:individualData]; 
    NSLog(@"Count of objects is %d:",[dataSet count]); 

    //Nor did this 
    dataSet = [[NSMutableArray alloc] initWithObjects:individualData, nil]; 
    NSLog(@"Count of objects is %d:",[dataSet count]); 

    self.title = @"DataDisplay"; 
} 

回答

1

的問題是,individualData實際上從來不設置爲一個實例化的對象(換句話說,這是從來沒有初始化)。

由於Objective-C關於發送消息到零的非錯誤策略,這些類型的疏忽是常見的;這是完全合法且經常有用的原則。這意味着你的代碼將永遠不會抱怨,直到你試圖將它傳遞給某個方法時,如果它看到nil,它將會崩潰。不幸的是,您正在使用initWithObjects,它只是將nil視爲(空)列表的末尾。如果您嘗試使用[NSArray arrayWithObject:individualData],您可能會看到一個錯誤提示您,您沒有使用對象而是使用零。

注意,在無設置屬性是特別棘手,因爲它看起來像你只是用C-SYLE處理左值的時候,居然將其轉換爲一個消息發送呼叫在運行時:

individualData.dataHeader = @"Header1"; 
// is *literally* the same as: 
[individualData setDataHeader:@"Header1"]; 

你可以選擇你的解決方案。 「便宜」的方法是在那裏簡單地初始化它。 「更好」的方式(通常)是懶惰實例化(即在getter中)。由於對象被標記爲原子,您可能需要讓編譯器編寫的getter你,只是初始化它在viewDidLoad中(或awakeFromNib,利用initWithCoder或類似):

- (void)viewDidLoad 
{ 

    [super viewDidLoad]; 
    self.individualData = [[DataDefinition alloc] init]; 
    ... 
+0

我嘗試這樣做。但是我得到一個錯誤,表示'DataDefinition'沒有可見的@interface聲明選擇器'alloc' – user1509593

+0

您是否在DataDisplay.m文件中導入了正確的標題?即該文件是否具有到DataDefinition.h文件的簡潔#import路徑?如果這個類擴展了NSObject,那就不應該有兩種方式; alloc/init在那裏。 –

+0

好吧,DataDefinition.h是由File - > New - > File(Cocoa touch,Objective C)類創建的NSObject。 DataDisplay.h有#import「DataDefinition.h」和DataDefinition.m有#import「DataDisplay.h」 – user1509593