在这里完全糊涂了。
我有一个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]];
答案 0 :(得分:2)
你是对的,那些属性值是指针,所以这里应该只有一个可变数组。我同意andyvn22其他事情正在发生,这在你到目前为止发布的代码中并不明显。
这是一种可能的调试方法:在每个NSLog上设置一个断点,当你进入调试器时,使用调试窗口(cmd-shift-Y)来检查照片属性的实际内存地址。每个案例。只有两种可能性:
地址是相同的,在这种情况下它实际上是相同的数组,而你没想到的一些代码是在第一个日志和第二个日志之间改变数组;或者,
地址不同,即它们是不同的数组,而您想不到的一些代码是将新数组重新分配给子(或父)照片属性。
答案 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*
时。这应该使它们保持同步,因为将指针设置为彼此将使它们指向同一个对象。