2011-07-04 126 views
3

我对下面解释的一个指针情况感到困惑;指针混淆

在A类

@property(nonatomic,retain)NSMutableArray *words; 

在B类现在

@property(nonatomic,retain)NSMutableArray *words; 

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

,如果我在一个类中添加新词话阵列,为什么不让我看到,在类的话阵列字B'我认为我在B类中的单词数组是指向A类单词的指针?

+0

两者都属于不同的类别。那么怎么可能呢? –

+0

@Cyprian classB中的'''属性是在你做任务的时候实例化的吗? –

+1

它应该工作。你的代码中还有其他的东西会导致数组不同。 – 2011-07-04 10:09:02

回答

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

基本上变化应该反映在两个数组,直到你改变任何两个物体的一些地方在你的代码中参考

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

而在你A类B类一些地方,

self.words = someOtherArray; 

这将使阵列两个类的指向不同的对象。

+0

我认为保留只是声明一个对象的所有权,而不是创建它的副本。 – Cyprian

+0

@Cyprian,是的。抱歉。你是对的。确保你没有分配任何其他引用到这两个单词数组中的任何其他地方。 - EmptyStack – EmptyStack

+0

实际上就像Bavarious所说的,这个想法是正确的,我的代码中有一些错误。 – Cyprian

1

它是你尝试运行的代码吗? 如果是的话,看起来你的B类代码中有一个mystake,因为单词在B类中与[classB单词]是一样的。 (在B类中:self.words = [classB words])。 也许一个像这样的指令:self.words = [classA words] ....应该解决你的问题(假设classA是类A的一个对象)。