iOS开发小知识笔记 (1)property

1 @property

  • @property 是 readwrite,assign,atomic
  • 在使用 @property 时, 编译器默认会进行自动 synthesize,生成 getter 和 setter,同时把 ivar 和属性绑定起来
  • 使用 @dynamic,显式表示不希望编译器生成 getter 和 setter
  • protocol 中定义的属性,编译器不会自动 synthesize,需要手动写
  • 当重载父类中的属性时,也必须手动写 synthesize
1.1 copy与strong关键字
  1. NSString、NSArray、NSDictionary 等等使用copy关键字(block也是使用copy)
    2.它们的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary使用strong关键字

对象拷贝有两种方式:浅复制(指针拷贝)深复制(内容拷贝)
集合的深复制有两种方法
(1)initWithArray:copyItems: 第二个参数设置为YES即可深复制

NSDictionary shallowCopyDict = [[NSDictionary alloc] initWithDictionary:someDictionary copyItems:YES];

如果你用这种方法深复制,集合里的每个对象都会收到 copyWithZone: 消息。
如果集合里的对象遵循 NSCopying 协议,那么对象就会被深复制到新的集合。
如果对象没有遵循 NSCopying 协议,而尝试用这种方法进行深复制,会在运行时出错。
copyWithZone: 这种拷贝方式只能够提供一层内存拷贝(one-level-deep copy),而非真正的深复制。

(2)将集合进行归档(archive),然后解档(unarchive)

NSArray *trueDeepCopyArray = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:oldArray]];

集合类对象的copy与mutableCopy

NSArray *array = @[@[@"a", @"b"], @[@"c", @"d"];
NSArray *copyArray = [array copy];
NSMutableArray *mCopyArray = [array mutableCopy];
结果:copyArray和array的地址是一样的,而mCopyArray和array的地址是不同的。说明copy操作进行了指针拷贝,mutableCopy进行了内容拷贝。但需要强调的是:此处的内容拷贝,仅仅是拷贝array这个对象,array集合内部的元素仍然是指针拷贝

NSMutableArray *array = [NSMutableArray arrayWithObjects:[NSMutableString stringWithString:@"a"],@"b",@"c",nil];
NSArray *copyArray = [array copy];
NSMutableArray *mCopyArray = [array mutableCopy];
结果:copyArray、mCopyArray和array的内存地址都不一样,说明copyArray、mCopyArray都对array进行了内容拷贝

  • 浅复制(shallow copy):在浅复制操作时,对于被复制对象的每一层都是指针复制。
  • 深复制(one-level-deep copy):在深复制操作时,对于被复制对象,至少有一层是深复制。
  • 完全复制(real-deep copy):在完全复制操作时,对于被复制对象的每一层都是对象复制。

更多详情请看

你可能感兴趣的:(iOS开发小知识笔记 (1)property)