0

私は「あなたの2番目のiOSアプリ」をフォローしていて、ObjectiveCをよく理解するためにコードを試してみることにしました...

私がやろうとしているのは、クラス内の可変配列にオブジェクトを追加することです。クラスは次のとおりです。

BirdSighting.h

#import <Foundation/Foundation.h>

@interface BirdSighting : NSObject
@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *location;
@property (nonatomic, copy) NSDate *date;

-(id) initWithName: (NSString *) name location:(NSString *) location date:(NSDate *) date;
@end

BirdSighting.m

#import "BirdSighting.h"

@implementation BirdSighting
-(id) initWithName:(NSString *)name location:(NSString *)location date:(NSDate *)date
{
    self = [super init];

    if(self) {
        _name = name;
        _location = location;
        _date = date;

        return self;
    }

    return nil;
}

@end

BirdSightingDataController.h

#import <Foundation/Foundation.h>
@class BirdSighting;

@interface BirdSightingDataController : NSObject
@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

- (NSUInteger) countOfList;
- (BirdSighting *) objectInListAtIndex: (NSUInteger) theIndex;
- (void) addBirdSightingWithSighting: (BirdSighting *) sighting;
@end

BirdSightingDataController.m

#import "BirdSightingDataController.h"

@implementation BirdSightingDataController
- (id) init {
    if(self = [super init]) {
        NSMutableArray *sightingList = [[NSMutableArray alloc] init];
        self.masterBirdSightingList = sightingList;
        return self;
    }

    return nil;
}

-(NSUInteger) countOfList 
{
    return [self.masterBirdSightingList count];
}

- (BirdSighting *) objectInListAtIndex: (NSUInteger) theIndex
{
    return [self.masterBirdSightingList objectAtIndex:theIndex];
}

- (void) addBirdSightingWithSighting: (BirdSighting *) sighting
{
    [self.masterBirdSightingList addObject:sighting];
}
@end

そして、これは私がBirdSightingインスタンスを可変配列に追加しようとしているところです:

#import "BirdsMasterViewController.h"
#import "BirdsDetailViewController.h"

#import "BirdSightingDataController.h"
#import "BirdSighting.h"

@implementation BirdsMasterViewController

- (void)awakeFromNib
{
    [super awakeFromNib];

    BirdSightingDataController *dataController = [[BirdSightingDataController alloc] init];

    NSDate *date = [NSDate date];
    BirdSighting *sighting = [[[BirdSighting alloc] init] initWithName:@"Ebabil" location:@"Ankara" date: date];

    [dataController addBirdSightingWithSighting: sighting];
    NSLog(@"dataController: %@", dataController.masterBirdSightingList);

    self.dataController = dataController;

}
..........
@end

BirdSightingDataControlleraddBirdSightingWithSightingメソッドでNSInvalidArgumentExceptionをスローします...

私は何が間違っているのですか?

これは完全なデバッグ出力です:2012-11-26 01:22:38.495 BirdWatching [4597:c07]-[__ NSArrayI addObject:]:認識されないセレクターがインスタンス0x71899d0に送信されました2012-11-26 01:22:38.496 BirdWatching [4597: c07] *キャッチされない例外によるアプリの終了'NSInvalidArgumentException'、理由:'-[__ NSArrayI addObject:]:認識されないセレクターがインスタンス0x71899d0に送信されました'

4

3 に答える 3

2

この行:

BirdSighting *sighting = [[[BirdSighting alloc] init] initWithName:@"Ebabil" location:@"Ankara" date: date];

する必要があります:

BirdSighting *sighting = [[BirdSighting alloc] initWithName:@"Ebabil" location:@"Ankara" date: date];

2つの初期化子を呼び出すことはできません。

アップデート:

完全なエラーメッセージに基づいて、問題が発生しました。あなたNSMutableArrayがプロパティのために持っていると思うあなたは本当にNSArrayです。これは、プロパティをで定義することによって発生しますcopy

プロパティを定義するcopyと、オブジェクトの不変のコピーが作成されます。したがって、を割り当てるNSMutableArrayと、不変のコピーが作成され、インスタンス変数に割り当てられます。NSArrayしたがって、ではなく、を割り当てることになりますNSMutableArray

修正は、プロパティ定義を次のように変更することです。

@property (nonatomic, copy) NSMutableArray *masterBirdSightingList;

に:

@property (nonatomic, strong) NSMutableArray *masterBirdSightingList;
于 2012-11-25T23:13:34.833 に答える
0

エラーメッセージを読むと、「addObject」がNSArrayに「送信」されたことが示され、それは無効でした。それは本当です。NSArrayの仕様を見ると、メソッド「addObject」は見つかりません。

「addObject」を実行しようとしているNSArrayがどこかにあります。エラーが発生したコードのセクションをリストしなかったため、または最初にNSMutableArrayにした後、どこかで「masterBirdSightingList」をNSArrayに設定しているため、どこにあるかを判断するのは難しいです。

于 2012-11-25T23:35:43.383 に答える
0

0

NSMutable配列のインスタンスに認識されないセレクターが送信されたという同様のエラーが発生しました。多くのことを実行した後、可変配列をプロパティとして使用していることがわかりました。

@property(assign、nonatomic)NSMutableArray * myMutableArray;

コピー貼り付け中に注意を払わず、問題を引き起こしていました。

私がそれを強いタイプに変更した解決策(あなたの要件に応じて、強い/弱いなどの他のタイプに変更することができます)。だから私の場合の解決策は:

@property(strong、nonatomic)NSMutableArray * myMutableArray; ですので、コピー貼り付けの際はご注意ください!一度確認してください。

于 2019-04-23T14:03:30.480 に答える