NSArray / NSMutableArray:通过ref或值传递?

时间:2010-04-16 01:13:56

标签: objective-c nsmutablearray nsarray

在这里完全糊涂了。

我有一个PARENT UIViewController需要将NSMutableArray传递给CHILD UIViewController。我期待它通过引用传递,以便在CHILD中进行的更改将反映在PARENT中,反之亦然。但事实并非如此。两者都有一个声明为..的属性

@property (nonatomic, retain) NSMutableArray *photos;

示例:

在父母:

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

ChildViewController *c = [[ChildViewController alloc] init ...];
c.photos = self.photos;
...
...

...

在儿童中:

[self.photos addObject:obj1];
[self.photos addObject:obj2];

NSLog(@"Count:%d", [self.photos count]) // Equals 2 as expected

...

回到父母:

NSLog(@"Count:%d", [self.photos count])  // Equals 0 ... NOT EXPECTED

我以为他们都会访问相同的内存。这不是这种情况吗?如果不是......我如何保持两个NSMutableArrays同步?

使用更多代码进行更新...

IN PARENT UIViewController:

     - (void)loadView { 

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

         // Create view for root controller
     UIView *rootView = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
     self.view = rootView;
     self.view.backgroundColor = [UIColor colorWithPatternImage: [UIImage imageNamed:@"green_felt_bg.jpg"]];
     [rootView release];

     ChildViewController *c = [[ChildViewController alloc] initWithNibName:@"ChildView" bundle:nil];
     self.childViewController = c;
     [c release];

     self.childViewController.photos = self.photos;
     self.childViewController.delegate = self;

     [self.view insertSubview:self.childViewController.view atIndex:0];
 } 

在CHILD ViewController中,我只是在其中添加对象。在完成添加PARENT处理的对象时调用委托方法。没有其他重大事件发生。 Code child用于修改其“照片”属性..

[[self mutableArrayValueForKey:@"photos"] 
        addObject:[photo resizedImageWithContentMode:UIViewContentModeScaleAspectFit bounds:CGSizeMake(200.0f, 300.0f) interpolationQuality:kCGInterpolationLow]];

2 个答案:

答案 0 :(得分:2)

你是对的,那些属性值是指针,所以这里应该只有一个可变数组。我同意andyvn22其他事情正在发生,这在你到目前为止发布的代码中并不明显。

这是一种可能的调试方法:在每个NSLog上设置一个断点,当你进入调试器时,使用调试窗口(cmd-shift-Y)来检查照片属性的实际内存地址。每个案例。只有两种可能性:

  1. 地址是相同的,在这种情况下它实际上是相同的数组,而你没想到的一些代码是在第一个日志和第二个日志之间改变数组;或者,

  2. 地址不同,即它们是不同的数组,而您想不到的一些代码是将新数组重新分配给子(或父)照片属性。

  3. 祝你好运!

答案 1 :(得分:-2)

最简单的方法是不使用合成的访问器方法,只需滚动自己的get / set方法,专门设置指针引用相等。

查看apple documentation on properties,即使您不使用@synthesize指令,仍然可以使用带有属性的便捷点符号。

我的猜测是你希望它们看起来像:

-(NSMutableArray*)photos
{
    return photos_internal_pointer;
}
-(void)setPhotos:(NSMutableArray*)newValue
{
    [newValue retain];
    [photos_internal_pointer release];
    photos_internal_pointer = newValue;
}

photos_internal_pointer类型为NSMutableArray*时。这应该使它们保持同步,因为将指针设置为彼此将使它们指向同一个对象。