2011-07-04 23 views
3

以下で説明する1つのポインタの状況について混乱します。クラスでポインタの混乱

@property(nonatomic,retain)NSMutableArray *words; 

//creating a pointer to words from classB 
self.words = [classB words]; 

今、私は、クラスAの単語の配列に新しい単語を追加する場合、クラスBでは

@property(nonatomic,retain)NSMutableArray *words; 

は、なぜ私は、クラス内の単語列でその単語が表示されませんB?私はクラスBの私の言葉の配列がクラスAの単語へのポインタだと思った?

+0

どちらも異なるクラスに属しています。どのようにそれが可能ですか? –

+0

@Cyprian 'classB'の' words'プロパティは、あなたが割り当てを行う時にインスタンス化されていますか? –

+1

それは動作するはずです。あなたのコードに配列が違う何かがあります。 –

答えて

1

皆さんの中には、うまくいくはずだと言われている人もいます。私は自分のコードにいくつかの誤りがありました。

#import "PointersAppDelegate.h" 

#import "PointersViewController.h" 

#import "ClassA.h" 
#import "ClassB.h" 

@implementation PointersAppDelegate 

@synthesize window=_window; 

@synthesize viewController=_viewController; 

@synthesize classA, classB; 

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions 
{ 
    classA = [[ClassA alloc] init]; 
    classB = [[ClassB alloc] init]; 

    self.window.rootViewController = self.viewController; 
    [self.window makeKeyAndVisible]; 

    //Add new word to words in classA 
    [[classA words] addObject:@"two"]; 

    //Print words in classB 
    [classB print]; 

    return YES; 
} 

- (void)dealloc 
{ 
    [_window release]; 
    [_viewController release]; 

    [classA release]; 
    [classB release]; 

    [super dealloc]; 
} 

@end 

//クラスA

// ClassA.h 

@interface ClassA : NSObject { 
    NSMutableArray *words; 
} 
@property(nonatomic,retain)NSMutableArray *words; 

@end 


// ClassA.m 

#import "ClassA.h" 

@implementation ClassA 

@synthesize words; 


- (id)init{ 
    self = [super init]; 
    if (self) { 
     words = [[NSMutableArray alloc] initWithObjects:@"one", nil]; 
    } 
    return self; 
} 


- (void)dealloc { 
    [words release]; 
    [super dealloc]; 
} 
@end 

ClassBの結果は

// ClassB.h 

#import <Foundation/Foundation.h> 


@interface ClassB : NSObject { 
    NSMutableArray *words; 
} 
@property(nonatomic,retain)NSMutableArray *words; 

-(void)print; 

@end 


// ClassB.m 
#import "ClassB.h" 
#import "PointersAppDelegate.h" 

@implementation ClassB 

@synthesize words; 

- (id)init{ 
    self = [super init]; 
    if (self) { 
     self.words = [[(PointersAppDelegate*)[[UIApplication sharedApplication] delegate] classA] words]; 
    } 
    return self; 
} 

-(void)print{ 
    for(int i=0;i<[words count];i++) 
     NSLog(@"%@", [words objectAtIndex:i]); 
} 

- (void)dealloc { 
    [words release]; 

    [super dealloc]; 
} 
@end 

です

しかし、これはどのようにすべきであることを証明するために少しのコード例を与えたいと思いました
2011-07-04 12:38:33.759 Pointers[20059:707] one 
2011-07-04 12:38:33.767 Pointers[20059:707] two 
1

参照の2つのオブジェクトのいずれかをコード内のどこかに変更するまで、基本的に両方の配列に変更が反映されるはずです。これは、両方のクラスの言葉配列が異なるオブジェクトを指すようになります

self.words = someOtherArray; 

//creating a pointer to words from classB 
self.words = [classB words]; 

そして、あなたのクラスまたはクラスBでいくつかの場所、。

+0

私は、オブジェクトの所有権を宣言し、オブジェクトのコピーを作成しないことだけを考えています。 – Cyprian

+0

@Cyprian、はい。ごめんなさい。あなたが正しいです。それらの2つの単語の配列のどこかに他の参照を割り当てていないことを確認してください。 - EmptyStack – EmptyStack

+0

実際にBavariousが言ったように、アイデアは正しいです、私は自分のコードにいくつかの誤りがありました。 – Cyprian

1

実行しようとしているコードはありますか? はいの場合、クラスBのコードには誤りがあるようです。の単語は[classB words]と同じです。 (クラスB:self.words = [classB words])。 おそらく、以下のような命令があります:self.words = [classA words] ....あなたの問題を解決するはずです(クラスAがクラスAのオブジェクトであると仮定します)。