美文网首页
ARC中@property的copy属性与copy方法

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

作者: conowen | 来源:发表于2017-07-05 15:00 被阅读48次

    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 *类型。

    相关文章

      网友评论

          本文标题:ARC中@property的copy属性与copy方法

          本文链接:https://www.haomeiwen.com/subject/ujdqhxtx.html