2014-11-06 75 views
1

据我所知,如果一个对象属性有一个可变的子类,一个属性应该是copy而不是strong,以防止该变量在没有该类的许可的情况下进行变异。为了充分理解原理,我使用strong创建了两个不同的示例,但我不理解第二个示例的结果。属性属性 - 强大还是复制示例?

@interface Person: NSObject 

@property (nonatomic, strong) NSArray* siblings; 

@end 

@implementation Person 

//init - initialize empty siblings array 

//setter 
- (void)setSiblings:(NSArray *)siblings{ 

    _siblings = siblings; 

} 

@end 

实施例1:

int main{ 

    NSMutableArray* siblings = [@[@"Nikita"] mutableCopy]; 

    Person* person = [Person alloc] init]; 

    //This calls the setter and creates a strong 
    //reference to the siblings array above 
    person.siblings = siblings; 

    NSLog(@"1: %@ ", person.siblings); 

    //Here I am able to change the siblings array and that 
    //change will reflect inside the person.siblings instance variable 
    [siblings addObject:@"Andre"]; 

    NSLog(@"2: %@ ", person.siblings); 

} 

Output: 
1: (Nikita) 
2: (Nikita, Andre) 

实施例2:

int main{ 

    NSMutableArray* siblings = [@[@"Nikita"] mutableCopy]; 

    Person* person = [Person alloc] init]; 

    //This calls the setter and creates a strong 
    //reference to the siblings array above 
    person.siblings = siblings; 

    NSLog(@"1: %@ ", person.siblings); 

    //Here the change is not reflected in person.siblings instance variable 
    siblings = [@[@"Andre"] mutableCopy]; 

    NSLog(@"2: %@ ", person.siblings); 

} 

Output: 
1: (Nikita) 
2: (Nikita) 

为什么,在第二示例中,当我改变的siblings值是不更改为person.siblings

回答

1

从你的第二个例子:

siblings = [@[@"Andre"] mutableCopy]; 

你正在改变命名siblings指一个新对象局部变量person对象的siblings属性仍指旧数组。

这里是内存看起来像该行之前:

before

下面是什么样子后:

after