2014-11-18 3 views
2

Я говорю о проектах ARC.Должен ли я использовать копии или сильные массивы?

Я всегда заявленные свойства массива, как это

@property (strong, nonatomic) NSArray *myArray; 

, но я видел много людей, рекомендующих использовать это:

@property (copy, nonatomic) NSArray *myArray; 

Людей предполагающих копию говорят «Копия на туАггау, чтобы предотвратить изменение другим «владельцем» объекта, который вы установили ». Это «объяснение» звучит для меня клингон.

Может кто-нибудь объяснить смысл этого, поскольку мне 5 лет? Хорошо, сделайте это 3.

благодаря

ответ

13

Копия мелкая, она копирует только указатель. Если массив содержит изменяемый объект и этот объект изменен, изменение будет отображаться в скопированном массиве.

NSMutableString *s = [@"test1" mutableCopy]; 
NSArray *a1 = @[s]; 
NSArray *a2 = [a1 copy]; 
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2); 
[s appendString:@"2"]; 
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2);  

Выход:

a1: 0x10010fed0, (
    test1 
) 
a2: 0x10010fed0, (
    test1 
) 

a1: 0x10010fed0, (
    test12 
) 
a2: 0x10010fed0, (
    test12 
) 

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

NSString *s1 = @"test1"; 
NSString *s2 = @"test2"; 
NSMutableArray *a1 = [@[s1] mutableCopy]; 
NSArray *a2 = [a1 copy]; 
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2); 
[a1 addObject:s2]; 
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2); 

Выход:

a1: 0x100200510, (
    test1 
) 
a2: 0x100200650, (
    test1 
) 

a1: 0x100200510, (
    test1, 
    test2 
) 
a2: 0x100200650, (
    test1 
) 

Обратите внимание, что копия на непреложный NSArray просто выполняет задание, так что ничего не стоит. Существует только копия, когда назначаемый массив является NSMutableArray.

NSString *s1 = @"test1"; 
NSString *s2 = @"test2"; 
NSArray *a1 = @[s1]; 
NSArray *a2 = [a1 copy]; 
NSLog(@"\na1: %1$p, %[email protected]\na2: %2$p, %[email protected]", a1, a2); 

Выход:

a1: 0x100300140, (
    test1 
) 
a2: 0x100300140, (
    test1 
) 
+0

FANTASTIC описание. БЛАГОДАРЯ! – SpaceDog

1

Его простая, Рассмотрим где-то в контроллере представления

NSArray *myArrayCopy = self.myArray 

Теперь Если туАггау сильна тогда, если вы изменяете какой-то объект в myArrayCopy туАггау будет автоматически изменен. в то время как в случае копирования он не будет изменен, поскольку он назначит копию myArray myArrayCopy.

1

Это зависит от того, хотите ли вы работать с одними и теми же данными. копия действительно также «сильная», так что объект не будет уничтожен до тех пор, пока сильный указатель не будет установлен на нуль. Но, сильный ссылается на тот же объект, в то время как копия ссылается на копию объекта. Сгенерированные сеттеры будут примерно такими:

-(void)setStrongArray:(NSArray*)data 
{ 
    _strongArray = data; 
} 

-(void)setCopyArray:(NSArray*)data 
{ 
    _strongArray = [data copy]; 
} 
1

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

NSMutableArray *array = [NSMutableArray arrayWithObjects:@1, @2, @3, nil]; 
obj.myArray = array; 
[array addObject:@4]; 

Если myArray был определен как strong, путем изменения локального изменяемый массив будет также изменить myArray свойство obj тоже.

Определяя myArray как copy, это гарантирует, что вам не нужно беспокоиться о том, что сам массив мутирует.

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

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