ARC中@property的copy属性与copy方法

2017-07-05  本文已影响48人  conowen

1、�可变对象的属性


@property (nonatomic, copy) NSMutableArray *arr;
NSMutableArray *arr0 = [NSMutableArray arrayWithObjects:@"0",@"1",@"2", nil];
self.arr = arr0;
NSLog(@"%@",[self.arr class]);

因为arr的@property是copy属性,所以self.arr = arr0;实际上为self.arr = [arr0 copy];,copy方法会返回一个不可变对象NSArray,所以Log打印出__NSArrayI,(immutable array)。就算手动写成self.arr = [arr0 mutableCopy],依然会执行self.arr = [[arr0 mutableCopy]copy];,自动在最后加上copy的。这时候只需要把属性改成strong就好。

2、不可变对象的属性


@property (nonatomic, strong) NSArray *arr;
NSMutableArray *arr0 = [NSMutableArray arrayWithObjects:@"0",@"1",@"2", nil];
self.arr = arr0;
NSLog(@"%@",[self.arr class]);

因为arr的@property是�strong属性,所以self.arr = arr0;实际上为self.arr = [arr0 �retain];,retain方法(在ARC中不能显式使用)只是增加引用计数,不改变对象本身,所以Log打印出`__NSArrayM�。所以这就是为什么不可变对象一般声明为copy类型,因为给这个对象赋值时,直接会隐性调用copy方法,返回不可变对象。

3、常用场景

- (NSArray *)children
{
    // Note: DDXMLNamespaceNode overrides this method
    
#if DDXML_DEBUG_MEMORY_ISSUES
    DDXMLNotZombieAssert();
#endif
    
    if (!IsXmlDocPtr(genericPtr) && !IsXmlNodePtr(genericPtr) && !IsXmlDtdPtr(genericPtr))
    {
        return nil;
    }
    
    NSMutableArray *result = [NSMutableArray array];
    
    xmlNodePtr child = ((xmlStdPtr)genericPtr)->children;
    while (child != NULL)
    {
        [result addObject:[DDXMLNode nodeWithUnknownPrimitive:(xmlKindPtr)child owner:self]];
        
        child = child->next;
    }
    
    return [result copy];
}

上述代码来源KissXML库,方法返回值为NSArray *类型,return [result copy];中的result为NSMutableArray *,调用copy方法,就返回一个不可变的NSArray *类型。

上一篇下一篇

猜你喜欢

热点阅读