2012-04-15 2 views
1

У меня есть класс со свойством NSArray с использованием ARC ничего фантазии ...NSArray изменен только если класс передается

#import <Foundation/Foundation.h> 
@interface MyClass : NSObject 
property(nonatomic, strong) (NSArray *) myArray; 
@end 

#import "MyClass.h" 
@implementation MyClass 
@synthesize myArray = _myArray; 
@end 

Если попытка использовать метод внутри другого класса, чтобы попытаться установить этот массив не устанавливает его, если передан только массив; однако, он устанавливается, если передается класс, я не уверен, почему это ....

код, который пытается это оба пути ниже ...

MyClass *myClass = [[MyClass alloc] init]; 
[self setArrayByPassingArray:myClass.myArray]; 
NSLog (@"%@", myClass.myArray) 
//result is null 

[self setArrayByPassingClass:myClass]; 
NSLog (@"%@", myClass.myArray) 
//result is test, test2... 

-(void)setArrayByPassingArray:(NSArray *)arrayToSet { 
arrrayToSet = [[NSArray alloc] initWithObjects: @"test", @"test2", nil]; 
} 

-(void)setArrayByPassingClass:(MyClass *)classWithArrayToSet { 
classWithArrayToSet.myArray = = [[NSArray alloc] initWithObjects: @"test", @"test2", nil]; 
} 

Я попробовал некоторые другие методы с только строки и строки не изменяются, так что я не знаю, почему они изменяются, если передается класс, содержащий их ...

ответ

1

Ваш setArrayByPassingArray: метод в первом примере присваивается вновь созданный NSArray его параметра , который передается по значению, и немедленно отбрасывается при выходе из метода. Здесь происходит копирование ссылки на myArray (а не копия массива, только копия ссылки на этот массив) до вызова setArrayByPassingArray:. Эта копия больше не прикреплена к члену myArray от MyClass.

Ваш второй пример не проходит класс - это прохождение экземпляр класса, а затем он правильно использует точечную нотацию, чтобы присвоить myArray свойство в вашем случае. Вот почему этот второй пример работает, а в первом примере этого нет.

Если вы используете NSMutableArray вместо NSArray всей вашей программы, вы можете переписать свой первый пример, чтобы сделать его работу:

-(void)setArrayByPassingArray:(NSMutableArray *)arrayToSet { 
    [arrrayToSet setArray:[[NSArray alloc] initWithObjects: @"test", @"test2", nil]]; 
} 
+0

@Nick Вам нужно сделать '' myArray' в NSMutableArray'. Я также забыл исправить подпись 'setArrayByPassingArray' - теперь я ее редактировал. – dasblinkenlight

+0

NSMutableArray также не работал, но менял его на - (void) changeArray: (NSMutableArray **) array { * array = [[NSMutableArray alloc] initWithObjects: @ "test", @ "test2", nil]; а затем с помощью & array, чтобы он передавал указатель ... спасибо за вашу помощь } - (void) changeArray2: (NSArray **) array { * array = [[NSMutableArray alloc] initWithObjects: @ " test ", @" test2 ", nil]; – Nick

+0

@Nick Трюк с указателем на указатель должен сработать, вот как «бедный человек проходит по ссылке» работает в C и Objective C. Трюк с 'NSMutualArray' тоже должен работать: убедитесь, что метод вызывает' setArray' вместо выполнения задания. – dasblinkenlight

Смежные вопросы