0

以下のコードでは、オブジェクトを配列に追加しようとしています。エラーはありませんが、オブジェクトを追加していません。このかなり基本的な質問をして申し訳ありません。助けが必要

NS オブジェクト定義
//DataDefinition.h #import

@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

#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";
}
4

1 に答える 1

1

問題はindividualData、インスタンス化されたオブジェクトに実際に設定されることは決してないということです(つまり、初期化されることはありません)。

これらの種類の見落としは、メッセージをnilに送信することに関するObjective-Cの非エラーポリシーのために一般的です。それは完全に合法であり、しばしば有用な原則です。これは、nilが表示された場合にクラッシュするメソッドにコードを渡そうとするまで、コードが文句を言うことはないことを意味します。残念ながら、を使用してinitWithObjectsいます。これは、単にnilを(空の)リストの最後と見なします。代わりに使用しようとした場合[NSArray arrayWithObject:individualData]、オブジェクトの代わりにnilを使用していることを示唆するエラーが表示された可能性があります。

nilにプロパティを設定するのは特に注意が必要です。これは、実行時に実際にメッセージ送信呼び出しに変換されるときに、単にCスタイルの左辺値を処理しているように見えるためです。

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

あなたは解決策を選ぶことができます。「安価な」方法は、その場で初期化することです。「より良い」方法は(通常)怠惰なインスタンス化です(つまり、ゲッターで)。オブジェクトはアトミックとしてマークされているため、コンパイラーにゲッターを作成させ、viewDidLoad(またはawakeFromNib、initWithCoderなど)で初期化する必要があります。

- (void)viewDidLoad
{

    [super viewDidLoad];
    self.individualData = [[DataDefinition alloc] init];
    ...
于 2012-08-26T02:02:56.557 に答える