网站怎么建设与管理,app推广需要多少钱,注册公司需要什么条件吗,摄影网站模版assign#xff1a; 简单赋值#xff0c;不更改索引计数copy#xff1a; 建立一个索引计数为1的对象#xff0c;然后释放旧对象retain#xff1a;释放旧的对象#xff0c;将旧对象的值赋予输入对象#xff0c;再提高输入对象的索引计数为1 Copy其实是建立了一个相同的对象…assign 简单赋值不更改索引计数copy 建立一个索引计数为1的对象然后释放旧对象retain释放旧的对象将旧对象的值赋予输入对象再提高输入对象的索引计数为1 Copy其实是建立了一个相同的对象而retain不是比如一个NSString对象地址为0×1111内容为”STR”Copy到另外一个NSString之 后地址为0×2222内容相同新的对象retain为1 旧有对象没有变化 retain到另外一个NSString之 后地址相同建立一个指针指针拷贝内容当然相同这个对象的retain值1 也就是说retain是指针拷贝copy是内容拷贝。在拷贝之前都会释放旧的对象。 * 使用assign: 对基础数据类型 NSInteger和C数据类型int, float, double, char,等* 使用copy 对NSString* 使用retain 对其他NSObject和其子类 1.readonly表示这个属性是只读的就是只生成getter方法不会生成setter方法2.readwrite设置可供访问级别3.retain是说明该属性在赋值的时候先release之前的值然后再赋新值给属性引用再加1。4.nonatomic非原子性访问不加同步多线程并发访问会提高性能。注意如果不加此属性则默认是两个访问方法都为原子型事务访问。 retain和copy还有assign的区别 1. 假设你用malloc分配了一块内存并且把它的地址赋值给了指针a后来你希望指针b也共享这块内存于是你又把a赋值给assign了b。此时a和b指向同一块内存请问当a不再需要这块内存能否直接释放它答案是否定的因为a并不知道b是否还在使用这块内存如果a释放了那么b在使用这块内存的时候会引起程序crash掉。 2. 了解到1中assign的问题那么如何解决最简单的一个方法就是使用引用计数reference counting还是上面的那个例子我们给那块内存设一个引用计数当内存被分配并且赋值给a时引用计数是1。当把a赋值给b时引用计数增加到2。这时如果a不再使用这块内存它只需要把引用计数减1表明自己不再拥有这块内存。b不再使用这块内存时也把引用计数减1。当引用计数变为0的时候代表该内存不再被任何指针所引用系统可以把它直接释放掉。 3. 上面两点其实就是assign和retain的区别assign就是直接赋值从而可能引起1中的问题当数据为int, float等原生类型时可以使用assign。retain就如2中所述使用了引用计数retain引起引用计数加1, release引起引用计数减1当引用计数为0时dealloc函数被调用内存被回收。4. copy是在你不希望a和b共享一块内存时会使用到。a和b各自有自己的内存。5. atomic和nonatomic用来决定编译器生成的getter和setter是否为原子操作。在多线程环境下原子操作是必要的否则有可能引起错误的结果。加了atomicsetter函数会变成下面这样if (property ! newValue) {[property release];property [newValue retain];} 关于retain,copy,assign的区别问题其实困扰我很久了因为在程序中不太常用到copyassign所以三者的具体差别一直不太明白。按照我的理解assign和retain的区别就是引入了一个计数器retaincount就可以对一个内存的释放方便很多。copy就是把原来的内存复制一遍使各自都拥有一个内存这样释放的时候也不会出错。assign 简单赋值不更改索引计数Reference Counting。copy 建立一个索引计数为1的对象然后释放旧对象retain释放旧的对象将旧对象的值赋予输入对象再提高输入对象的索引计数为1使用assign: 对基础数据类型 NSIntegerCGFloat和C数据类型int, float, double, char, 等等使用copy 对NSString使用retain 对其他NSObject和其子类nonatomic非原子性访问不加同步多线程并发访问会提高性能。注意如果不加此属性则默认是两个访问方法都为原子型事务访问 property(nonatomic, retain) UITextField *userName编译时自动生成的代码- (UITextField *) userName {return userName;} - (void) setUserName:(UITextField *)userName_ {[userName release];userName [userName_ retain];} property(retain) UITextField *userName自动生成的代码 - (UITextField *) userName {UITextField *retval nil;synchronized(self) {retval [[userName retain] autorelease];}return retval;} - (void) setUserName:(UITextField *)userName_ {synchronized(self) {[userName release];userName [userName_ retain];}} 转载于:https://www.cnblogs.com/Yole58546/p/4550071.html