readonly,readwrte,@property,nonatomic,assign,retain,copy,strong,weak属性关键字

1.readonly是只读

 

2.readwrite是读写

 

3.@property关键字:设置成员变量的属性(有读/写,赋值assign,retain,copy ,以及对多线程的支持nonatomic)。

 

4.nonatomic非原子性访问,对属性赋值的时候不加锁,多线程并发访问会提高性能。如果不加此属性,则默认是两个访问方法都为原子型事务访问。

 

5.assign简单赋值,不会引起引用计数的变化。适用于基础类型(NSInteger,CGFloat),C语言里的(int,double,float,char等),就是简单的数据类型。

举个例子说明,给一块申请到的内存alloc一个指针a,然后将a赋给b让b的指针也指向这块内存,两个指针同时指向同一块内存。a指针使用完这块内存以后并不知道b是否还在使用这块内存,将它release掉,这时候就会引起程序崩溃。

 

6.retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

继续上边的例子,如果a与b都是retain属性的话,内存赋值给a的时候就会引起内存引用计数+1,当a赋值给b的时候,又会引起一次内存引用计数+1.当a用完这块内存以后引用计数-1,此时还剩下1.等到b也用完的时候再减一次1,内存引用计数为0.此时将会释放该内存。

 

7.copy实际上就是建立了一个相同的对象。将相同的内容在内存上复制一份出来,两个对象的内存地址不同。而retain关键字则是复制了一份指向同一块内存地址的指针,同时引用计数+1.    说简单一点就是copy是复制内容,而retain是复制指针。

 

8.strong这个是强引用,引用计数会+1。

例如

  1. @property (nonatomic, strong) NSString *string1;   
  2. @property (nonatomic, strong) NSString *string2;
  1. self.string1 = @"String 1";   
  2. [self.string2 = self.string1;   
  3. [self.string1 = nil;  
  4. [NSLog(@"String 2 = %@", self.string2); 

会输出什么?

结果是string 2 = String 1

因为string 2 是strong属性,他指向的是String 1这个对象的内存。并且内存引用计数会+1.当self.string1=nil的时候,string1用完了被赋值空,而这块内存的引用计数器并不为0.继续存在,string2指向的这个字符串,所以会打印出这个结果。

 

9.weak这个是弱引用,引用计数不会+1。

例如

  1. @property (nonatomic, strong) NSString *string1;   
  2. @property (nonatomic, weak) NSString *string2;

 

  1.     self.string1 = [[NSString alloc] initWithUTF8String:"string 1"];   
  2. elf.string2 = self.string1;   
  3. self.string1 = nil;  
  4. NSLog(@"String 2 = %@", self.string2); 

会输出什么?

结果是String 2 = null;

self.string1与self.string'2都是指向同一块存放字符串string 1的内存。string2没有retain内存地址,而self.string1=nil释放了内存,所以string1为nil。string2声明为weak属性,指针指向的内存一旦被释放了,这些指针都将被赋值为nil,这样的好处能有效的防止野指针。

 

posted @ 2015-08-21 14:48  江南花印孓  阅读(158)  评论(0编辑  收藏  举报