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

1.readonly是只读

2.readwrite是读写

[email protected]关键字:设置成员变量的属性(有读/写,赋值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,这样的好处能有效的防止野指针。

时间: 2024-08-29 19:35:40

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

对于atomic nonatomic assign retain copy strong weak的简单理解

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作 1)atomic 设置成员变量的@property属性时,atomic是默认值,提供多线程安全 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic后setter函数会变成下面这样: {lock} if (property != newValue) { [property release]; property = [newValue retain]; } {unlock} 2)n

atomic nonatomic assign retain copy strong weak 介绍

atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作.         atomic 设置成员变量的@property属性时,默认为atomic,提供多线程安全. 在多线程环境下,原子操作是必要的,否则有可能引起错误的结果.加了atomic,setter函数会变成下面这样:                        {lock}                                if (property != newValue) {    

assign,copy,strong,weak,nonatomic的具体理解

例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段内存用来存储@' MM的三室两厅 ' ,比如:内存地址为 0X1111  内容为 ' MM的三室两厅' ,  2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111 下面分别看下(assign,retain,copy):  1.assign的情

assign,copy,strong,weak,nonatomic的理解

举个例子: NSString *houseOfMM = [[NSString alloc] initWithString:'MM的三室两厅']; 上面一段代码会执行以下两个动作:  1 在堆上分配一段内存用来存储@' MM的三室两厅 ' ,比如:内存地址为 0X1111  内容为 ' MM的三室两厅' ,  2 在栈上分配一段内存用来存储 houseForWife ,比如:地址为 0XAAAA  内容自然为 0X1111 下面分别看下(assign,retain,copy):  1.assign

如果将synthesize省略,语义特性声明为assign retain copy时,自己实现setter和getter方法

如果将synthesize省略,并且我们自己实现setter和getter方法时,系统就不会生成对应的setter和getter方法,还有实例变量 1,当把语义特性声明为assign时,setter和getter时方法内部实现 - (void)setName:(NSString *)name{ _name = name; } - (NSString *)name{ return _name; } 2,当把语义特性声明为retain时,setter和getter方法内部实现 - (void)set

【iOS面试系列-1】iOS中@property 后assign,copy,retain,weak,strong的意义与区别(必考-必须详细掌握)

来源:网络 assign: 普通(简单)赋值,一般常用于基本数据类型,常见委托设计模式,一次来防止循环引用.不更改索引计数(Reference Counting). 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等) retain:保留计数,获得到了对象的所有权,引用计数在原有基础上+1.释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1 .我们给那块内存设一个引用计数,当内存被分配并且赋值给a时,引用

iOS中属性 (nonatomic, copy, strong, weak)的使用 By hL

以下内容来自Stackflow的详解 1.Nonatomicnonatomic is used for multi threading purposes. If we have set the nonatomic attribute at the time of declaration, then any other thread wanting access to that object can access it and give results in respect to multi-th

ios OC 关键字 copy,strong,weak,assign的区别

一.先介绍 copy.strong.weak 的区别,如代码所示 @property(copy,nonatomic)NSMutableString*aCopyMStr; @property(strong,nonatomic)NSMutableString*strongMStr; @property(weak,nonatomic)NSMutableString*weakMStr; @property(assign,nonatomic)NSMutableString*assignMStr; NSMu

假设synthesize省略,语义属性声明assign retain copy时间,为了实现自己的setter和getter方法

假设synthesize省略,而且我们自己实现setter和getter方法时,系统就不会生成相应的setter和getter方法,还有实例变量 1,当把语义特性声明为assign时,setter和getter时方法内部实现 - (void)setName:(NSString *)name{ _name = name; } - (NSString *)name{ return _name; } 2,当把语义特性声明为retain时,setter和getter方法内部实现 - (void)setN