Полностью смущен здесь.NSArray/NSMutableArray: передано по ссылке или по значению?
У меня есть PARENT UIViewController, которому необходимо передать NSMutableArray в CHILD UIViewController. Я ожидаю, что он будет передан по ссылке, чтобы изменения, внесенные в РЕБЕНОК, отражались в 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?
UPDATE с некоторыми более кода ...
В РОДИТЕЛЕЙ 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];
}
В РЕБЕНКА ViewController я просто добавить объекты в него. Вызов метода делегата, когда выполняется добавление объектов ... которые обрабатывает PARENT. Ничего существенного не происходит. Код ребенок использует, чтобы изменить его свойство «фото» ..
[[self mutableArrayValueForKey:@"photos"]
addObject:[photo resizedImageWithContentMode:UIViewContentModeScaleAspectFit bounds:CGSizeMake(200.0f, 300.0f) interpolationQuality:kCGInterpolationLow]];
Ваша интуиция верна; если оба свойства действительно «сохраняются» (а не 'copy'!), то последний' NSLog' должен давать 2. Похоже, вам придется опубликовать еще какой-нибудь код. Возможно ли, что свойство 'photos' родителя изменяется в какой-то момент? – andyvn22
Yup .. оба свойства сохраняются ... и нет, свойство родительских фотографий не изменяется. Если я вернусь к дочернему контроллеру, счет будет по-прежнему «2». Это сводит меня с ума – wgpubs
Попробуйте отправить точный метод, из которого берутся строки 'addObject:' ребенка, и код в родительском объекте, который находится между 'c.photos = self.photos;' и 'NSLog' ... – andyvn22