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 *类型。
网友评论