淮北矿业工程建设公司网站,建一个网站的手机电脑,响应式视频网站,wordpress注册链接修改密码任何继承了NSObject的对象#xff0c;都需要内存管理#xff0c;但是对基本数据类型无效#xff08;不需要释放#xff09;原理#xff1a;每个对象内部都保存了一个与之相关联的整数#xff0c;称为引用计数器当使用alloc、new或者copy创建一个对象时#xff0c;对象的…任何继承了NSObject的对象都需要内存管理 但是对基本数据类型无效不需要释放 原理 每个对象内部都保存了一个与之相关联的整数称为引用计数器当使用alloc、new或者copy创建一个对象时对象的引用计数器被设置为1给对象发送一条retain消息可以使引用计数器值1给对象发送一条release消息可以使引用计数器值-1当一个对象的引用计数器值为0时那么它将被销毁其占用的内存被系统回收OC也会自动向对象发送一条dealloc消息。一般会重写dealloc方法在这里释放相关资源。一定不要直接调用dealloc方法。可以给对象发送retainCount消息获得当前的引用计数器值向对象发送某个消息相当于调用某个方法。 内存管理原则 谁创建谁释放“谁污染谁治理”。如果通过alloc、new或(mutable)copy来创建一个对象那么你必须调用release或autorelease。换句话说不是你创建的就不用你去释放。一般来说除了alloc、new或copy之外的方法创建的对象都被声明了autorelease谁retain谁release。只要你调用了retain无论这个对象谁如何生成的你都要调用release 如果在某个对象方法中retain了另一个对象需要在这个对象释放的时候同时释放retain的那个对象。 如果想要retain对象新的成员变量先释放掉旧的成员变量在释放掉旧的成员变量前要先判断新传递进来的成员变量与原来的成员变量是否相同如果不同则释放掉旧的成员变量如果相同则不release旧的成员变量也不进行retain。 property内存管理新特性 property一般帮我们自动生成的setter方法是很简单的方法不能实现内存管理例如 -(void)setBook:(Book*) book{_bookbook;
} 所以我们一般需要自己去实现book的setter方法例如 -(void)setBook:(Book *)book{if(_book!book){[_book release];_book[book retain];}
} 假如我们在某个类里要使用很多个property 语句去使用类的属性的时候如果还要自己在.m文件中去写setter方法会很麻烦所以我们可以这么写 property retainBook* book property retainCard* card 这里的retain代表release旧的值retain新的值 这样相当于我们在.m文件中实现了带有内存管理的setter方法即上面的代码 property的其他参数默认是readwrite属性同时生成get和set方法 propertyassignint age这句跟property int age等价property默认就是assign参数的 propertyreadonlyint age这句表示age是一个只读变量表示只生成get方法 property 格式property参数1参数2 类型 名字 参数可有可无比如 property int age property nonatomicretainUIButton* btn 参数主要分为3类 读写属性readwrite/readonly setter处理assign/retain/copy 原子性atomic/nonatomic property属性默认为atomic提供多线程安全 在多线程环境下原子操作是必要的否则就有可能引起错误的结果加了atomicsetter/getter是一个原子操作。如果有多个线程同时调用setter的话不会出现某一个线程执行setter全部语句之前另一个线程开始执行setter的情况相当于函数头尾加了锁一样 nonatomic代表方法不考虑线程安全问题 nonatomic表示禁止多线程变量保护提高性能atomic是OC使用的一种线程保护技术防止在写入未完成的时候被另外一个线程读取造成数据错误。而这种机制是耗费系统资源的所以在iphone这种小型设备上如果没有使用多线程间的通讯编程那么nonatomic是一个非常好的选择如果不需要多线程支持的话用nonatomic就够了另外由于不涉及锁操作所以它执行相对快点 property的setter处理 assign默认类型setter方法直接赋值而不进行retain操作 retainsetter方法release旧值再retain新值 copysetter方法release旧值再copy新值暂时先这么理解后续会有关于copy语法的新解释 property的读写属性 readwrite产生setter和getter readonly只产生简单的getter没有setter property的其他用法 例如propertynonatomicgetterisRichBOOL rich //getter是用来指定getter方法的方法名同理setter也可以这样用 自动释放池autorelease pool 自动释放池是OC里面的之中内存自动回收机制一般可以将一些临时变量添加到自动释放池中统一回收释放当自动释放池销毁时池里面的所有对象都会调用一次release方法OC对象只需要发送一条autorelease消息就会把这个对象添加到最近的自动释放池中栈顶的释放池autorelease实际上只是把对release的调用延迟了(相当于延迟回收对象)对于每一次autorelease系统只是把该对象放入了当前的autorelease pool中当该pool被释放时该pool中的所有对象会被调用renlease //autoreleasepool代表创建一个自动释放池
autoreleasepool{ //使用自动释放池 //之前 Book* book [[Book alloc] init]; [student setBook:book]; [book release]; //现在 Book *book [[[Book alloc] init] autorelease]; [student setBook:book]; //不用调用[book release] } 静态方法不需要自己释放内存我们在开发中会经常用到静态方法因为我们在实现静态方法时会把变量放到autorelease中这样就不用我们自己去释放内存了 另外静态方法不能访问对象的成员变量 autorelease pool注意 在ARC下不能使用[[NSAutoreleasePool alloc] init]而应当使用autoreleasepool不要把大量循环操作放到同一个NSAutoreleasePool之间这样会造成内存峰值的上升尽量避免对大内存使用该方法对于这种延迟释放机制还是尽量少用sdk中一般利用静态方法创建并返回的对象都是已经autorelease的不需要再进行release操作如[NSNumber numberWithInt:10];返回的对象是不需要再release的。但是通过[[NSNumber alloc] initWithInt:10]创建的对象需要release转载于:https://www.cnblogs.com/hqzxbb/p/4383749.html