指针混淆

3
我很困惑下面解释的一个指针问题;
在A类中,有一个名为ptr的指向B类对象的指针。现在,我创建了一个C类的对象并将其地址分配给ptr。这样做会导致什么问题?
@property(nonatomic,retain)NSMutableArray *words;

在B类中

 @property(nonatomic,retain)NSMutableArray *words;

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

现在如果我在类A的单词数组中添加新单词,为什么我在类B的单词数组中看不到该单词?我认为我在类B中的单词数组是指向类A中的单词的指针?

两者属于不同的类,那怎么可能呢? - Rakesh Bhatt
@Cyprian 在你进行赋值操作的时候,classB 中的 words 属性是否已经被实例化了? - Deepak Danduprolu
1
它应该可以工作。你的代码中还有其他东西导致数组不同。 - user557219
@Deepak 是的,它在之前被实例化了。 - Cyprian
@Bavarious,您是正确的,它应该可以工作,我的错误一定在别处。 - Cyprian
1
以上代码似乎将classB单词分配给自身。 - Hot Licks
3个回答

1

基本上,更改应该反映在两个数组中,直到您在代码的某个地方更改了任何两个对象之一的引用

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

在你的 A 类B 类 中的某个地方,

self.words = someOtherArray;

这将使得两个类的words数组指向不同的对象。


我认为保留(retain)只是声明对象的所有权,而不是创建其副本。 - Cyprian
@Cyprian,是的。抱歉。你是对的。确保你没有在其他地方将这两个单词数组分配给任何其他引用。- EmptyStack - EmptyStack
实际上,正如Bavarious所说的那样,这个想法是正确的,我的代码中有一些错误。 - Cyprian
@Cyprian,是的。这也是我说的;-) - EmptyStack

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

类B

// 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

这是你尝试运行的代码吗? 如果是的话,那么你的B类代码中似乎有一个错误,因为B类中的words与[classB words]相同(在B类中:self.words = [classB words])。 也许像这样的一条指令:self.words = [classA words]....可以解决你的问题(假设classA是class A的一个对象)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接