0

NSObjectからサブクラス化したクラスのカスタムオブジェクトの配列であるorganisationsと呼ばれるNSMutableArrayがあります。このサブクラスはNSXOrganisation呼ばれます。このサブクラスは、次のようにNSCopyを実装します。

@interface NSXOrganisation : NSObject <NSCopying>

...

- (id)copyWithZone:(NSZone *)zone
{
    id copy = [[[self class] alloc] init];

    if (copy) 
    {
        [copy setPropertyOne:[[[self getPropertyOne] copyWithZone:zone] autorelease]];           
    }

    return copy;
}

今、私は次のように配列を割り当てて初期化します:

organisations = [[NSMutableArray alloc] initWithArray:organisationsArray copyItems:YES];

これはすべて正常に機能します。テストのために、配列には2つのオブジェクトが含まれています。

次に、メソッドが呼び出されると、次のように配列内のオブジェクトを更新します。

- (void)updateOrganisation
{
    [[organisations objectAtIndex:0] setConsumerKey:[tfPropertyOne stringValue]];
}

ここで、 tfPropertyOne *はディスプレイ上のNSTextFieldです(適切にバインドされているなど)。NSLogでテストしたところ、正しい結果が出力されるため、これも正常に機能します。次に、配列内の別のインデックスでdisplayメソッドを呼び出して、関連する詳細を表示します。

- (void)displayOrganisation:
{
    [tfPropertyOne setStringValue:[[organisations objectAtIndex:index] getPropertyOne]];
}

indexはローカルNSIntegerであり、問​​題ではありません。次に、このオブジェクトに対して同じupdateメソッドを呼び出します。これは、明らかに正常に機能します(NSLogを使用してテストします)。

最後に、戻って配列[self displayOrganisation:0]の最初のオブジェクトを表示するために呼び出しを行うと、呼び出しは正常に機能しますが、 getPropertyOneを呼び出すとアプリがクラッシュします。

これは、Macコンソールのエラーです。

...: Invalid memory access of location 0x3bcfd069 eip=0x90c1cd5c

そして、これはクラッシュレポートからのものです:

Thread 0 Crashed:: Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x90c1cd4b objc_msgSend + 27
1   com.apple.Foundation            0x943da945 _NSDescriptionWithLocaleFunc + 57
2   com.apple.CoreFoundation        0x906503ae __CFStringAppendFormatCore + 12238
3   com.apple.CoreFoundation        0x906a70dc _CFStringCreateWithFormatAndArgumentsAux + 108
4   com.apple.CoreFoundation        0x9072821c _CFLogvEx + 124
5   com.apple.Foundation            0x9445d221 NSLogv + 136
6   com.apple.Foundation            0x9445d194 NSLog + 27
7   co.nz.fdl.XeroConnect           0x1b5b4872 -[PrefsController displayOrganisation:] + 194 (PrefsController.mm:229)

誰か助けてもらえますか?オブジェクトにアクセス/作成/配列に誤って保存していますか?

4

2 に答える 2

0

すでにリリースされているオブジェクトにアクセスしようとしているようです。自動解放呼び出しを確認してください。

于 2012-07-27T00:38:37.777 に答える
0

カスタムオブジェクトのヘッダーファイルを変更することで、この問題を修正することができました。

オリジナル:

@property (nonatomic, retain) NSString *propertyOne;

働く:

@property (copy) NSString *propertyOne;

この問題全体は、一般的に、Objective-Cの知識が不足していることに起因していました(したがって、私はまだ学習中です!)。みんなありがとう

于 2012-07-30T02:48:42.027 に答える