-1

目標は、他のクラスがアプリケーション全体で使用するデータの配列を含むクラスを作成することです。

私はこのGlobalObject.hを持ってい
ます。これは、データを格納するために使用される配列を宣言します。

#import <Foundation/Foundation.h>

@interface GlobalObjects : NSObject
@property (retain) NSMutableArray *animals;


-(id)init;
@end

私はこのGlobalObject.mを持っています。
NSDictionaryデータが含まれ、配列に格納されます。

#import <Foundation/Foundation.h>

@interface GlobalObjects : NSObject
@property (retain) NSMutableArray *animals;


-(id)init;
@end


#import "GlobalObjects.h"

@implementation GlobalObjects

@synthesize animals;

-(id)init{
    self = [super init];
    if (self) {
        // Define the data
        NSArray *imagesValue = [[[NSArray alloc] initWithObjects:@"dog.wav",@"cat.png",@"bird.png",nil] autorelease];
        NSArray *audioValue =[[[NSArray alloc] initWithObjects:@"dog.wav",@"cat.wav",@"bird.wav",nil] autorelease];
        NSArray *descriptionValue = [[[NSArray alloc] initWithObjects:@"Dog",@"Cat",@"Bird",nil] autorelease];

        // Store to array
        for (int i=0; i<8; i++) {
            NSDictionary *tempArr = [NSDictionary dictionaryWithObjectsAndKeys:[imagesValue objectAtIndex:i],@"image", [audioValue objectAtIndex:i],@"audio", [descriptionValue objectAtIndex:i], @"description", nil];
            [self.animals addObject:tempArr];
        }
    }
    return self;
}
@end

これが私がそれを呼ぶ方法です。

// someOtherClass.h
#import "GlobalObjects.h"
@property (nonatomic, retain) GlobalObjects *animalsData;

// someOtherClass.m
@synthesize animalsData;
self.animalsData = [[[GlobalObjects alloc] init] autorelease];
NSLog(@"Global Object %@ ",self.animalsData.animals);

ここで問題となるのは、この配列を別のクラスで呼び出すと、常にnullが返されることです。

私はiOSプログラミングに不慣れです。おそらく私の方法は間違っていますか?

4

2 に答える 2

1

「GlobalObjects」animalsのメソッドで配列を割り当てるのを忘れました:init

self.animals = [[NSMutableArray alloc] init];

これを行わないと効果self.animalsnilありaddObjectません。

ARC を使用しないため、 で配列を解放することを忘れないでくださいdealloc

編集: @H2CO3 と @Bastian が気づいたように、ARC の前のレッスンを忘れていました。したがって、self.animalsinit メソッドで割り当てる正しい方法は次のとおりです。

self.animals = [[[NSMutableArray alloc] init] autorelease];

そして、deallocあなたは追加する必要があります

self.animals = nil;

電話する前に[super dealloc]。私は今それを手に入れたことを願っています!

于 2012-09-09T08:56:19.353 に答える
1

はい、違います。インスタンス変数はクラス自体に関連付けられているのではなく、クラスの特定のインスタンスに関連付けられています。この問題に対する Cocoa 標準の解決策は、クラスの共有インスタンスを作成することです。

elf.animalsData = [[[GlobalObjects alloc] init] autorelease];

書きます

elf.animalsData = [GlobalObjects sharedInstance];

+ sharedInstance次のようにメソッドを実装します。

+ (id)sharedInstance
{
    static shared = nil;
    if (shared == nil)
        shared = [[self alloc] init];

    return shared;
}

@MartinR が指摘したように、別の間違いを犯します。オブジェクトを追加する配列を作成しないと、nil のままになり、それ自体に対するすべてのメソッド呼び出しの効果がキャンセルされます。メソッドで可変配列を割り当て初期化する必要があり- initます。

于 2012-09-09T08:56:49.513 に答える