当前位置: 首页 > news >正文

网站app免费生成软件网站建设多选题百度文库

网站app免费生成软件,网站建设多选题百度文库,详情页模板psd,高效网站建设咨询OC语言中的内存管理机制为ARC(Automatic Reference Counting,自动引用计数)。于2011年中旬推出#xff0c;替换陈旧且低效的手动内存管理#xff0c;关于手动内存管理的内容#xff0c;本章教程不再讲授。本章主要从以下几个方面对内存管理进行展开讲解。 内存管理原则对象引…  OC语言中的内存管理机制为ARC(Automatic Reference Counting,自动引用计数)。于2011年中旬推出替换陈旧且低效的手动内存管理关于手动内存管理的内容本章教程不再讲授。本章主要从以下几个方面对内存管理进行展开讲解。 内存管理原则对象引用类型属性引用类型强引用循环AUTO类型与释放池1.内存管理原则 核心原则没有被对象指针使用指向的内存立即释放。这个原则决定一般情况下不会有内存泄露的情况存在但存在特殊情况也是本章最后一个专题要阐述的问题。 内存泄露是指一块没有被指针引用的内存但由于一些原因无法释放造成内存浪费的情况。 管理原则 强引用对象指针使用中的内存绝对不会释放。归零弱引用对象指针使用中的内存释放情况由其他对象指针决定本身不影响内存释放与否但其指向的内存一旦释放本身立即置nil保证不出现野指针。弱引用对象指针使用中的内存释放情况由其他对象指针决定本身不影响内存释放与否但其指向的内存一旦释放本身值不会发生改变会出现野指针的情况。AUTO类型对象指针使用过或使用中的内存出释放池才会释放。通过AUTO类型与释放池配合使用可以精确调节内存时间提前或延后。2.对象引用类型 对象引用类型有如下四种 强引用__strong修饰的对象指针或无修饰的对象指针归零弱引用__weak修饰的对象指针弱引用__unsafe__unretain修饰的对象指针AUTO类型__autoreleasing修饰的对象指针首先分析强引用对象指针的使用情况。在分析内存释放情况时我们需要一个测试类进行释放测试。当一个对象释放时它的dealloc方法会被调用。所以我们在dealloc方法中进行相关输出便能精确看到该对象何时释放。 interface Test : NSObjectend implementation Test - (void)dealloc { NSLog(该对象释放); } end 情况1 int main(int argc, const char * argv[]) { { Test * t [[Test alloc]init]; } //代码运行至此t的作用域结束t指向的内存并无其他对象指针使用所以该内存在此释放。 return 0; } 情况2 int main(int argc, const char * argv[]) { { Test * t1; { Test * t [[Test alloc]init]; t1 t; } //代码运行至此t作用域结束但t指向的内存仍有t1对象指针使用所以在此该内存不会释放。 } //代码运行至此t1作用域结束t1指向的内存再无其他对象指针使用所以在此内存释放。 return 0; } 情况3 int main(int argc, const char * argv[]) { { Test * t [[Test alloc]init]; t nil;//代码运行至此t不再指向之前分配的内存之前的内存无对象指针使用释放。 } return 0; } 以上是强引用的常用情况其对象指针并无任何修饰符进行修饰但已经OC语法规定对象指针无修饰时为强引用类型。 我们继续讨论归零弱引用类型的对象指针对内存的影响。 情况1 int main(int argc, const char * argv[]) { { __weak Test * t1; { Test * t [[Test alloc]init]; t1 t; } //代码运行至此t作用域结束t指向的内存仍有t1对象指针使用但t1为归零弱引用不会影响对象释放情况所以在此内存释放且t1本身值变为nil } return 0; } 情况2 int main(int argc, const char * argv[]) { __weak Test * t1 [[Test alloc]init];//在此语句运行时分配的内存并无除弱引用对象指针以外的对象指针使用所以该内存立即释放。 return 0; } 以上是归零弱引用的情况不常用。归零弱引用只有一种情况下使用 代码块回调接口中的自身代码块引用自身对象例如 interface Room : NSObject property (strong, nonatomic) Light *lightA; property (strong, nonatomic) SwitchB *s; end implementation Room - (instancetype)init { self [super init]; if (self) { self.lightA [[Light alloc] init]; self.s [[SwitchB alloc] init]; __weak __block Room * copy_self self;//打破强引用循环强引用循环的概念下文会讲解。 self.s.changeStateBlockHandle ^(SwitchState state) { if (state SwitchStateOff) { [self.lightA turnOff]; } else { [self.lightA turnOn]; } }; } return self; } end 弱引用和归零弱引用管理内存的释放时间相同。弱引用是OC为兼容之前特殊情况下的内存管理而做的一个不常用类型。所以之后我们不会使用弱引用所有需要弱引用的地方全部以归零弱引用代替。 3.属性引用类型 属性的内存控制符有四种情况。 strongweakcopyassgin对于对象来说可选的只有前三种。第四种assgin为无内存管理主要针对基础数据类型设计。例如 property (assgin, nonatomic) int a;如果一个属性是对象那么其属性内存控制符必然是前三种之一。 strong:默认情况下使用除特殊情况。 weak:在遇到强引用循环时使用。 copy:在进行数值对象赋值时使用。 例如 property (copy, nonatomic) NSString * name; property (copy, nonatomic) NSNumber * age; 但也可以strong代替所以copy使用场景也不多见。 4.强引用循环 在内存管理中强引用循环是最严重的失误会造成大量内存泄露。通过一个例子来说明为什么会产生泄露。 首先用实际生活中的一个场景来具体的说明一下问题产生的原因。 例如现在在一个教室有学生有老师。老师对自己的要求是学生不离开教室我就不离开教室。而学生对自己的要求是老师不离开教室我就不离开教室。这样一直持续下去的结果就是双方谁都不会离开教室。 然后我们再看一下代码中何时会产生这种情况。 interface Student : NSObjectproperty (strong, nonatomic) Teacher *tea; endinterface Teacher : NSObjectproperty (strong, nonatomic) Student *stu; endmain() {{Teacher * tea [[Teacher alloc] init];Student * stu [[Student alloc] init];tea.stu stu;stu.tea tea;}}上述代码中可以发现Student类有一个strong类型的属性tea通过管理原则我们可以知道stu对象存在其强引用属性tea一定存在不会释放。同样Teacher有一个strong属性stutea对象存在意味着stu对象也绝对不会释放。这样当两个对象指针作用域消失时其使用的内存无法释放出现内存泄露。 这种问题便是内存管理中会遇到的强引用循环也是目前能够造成内存泄露的唯一原因。需要对这样的情况在设计层面进行避免。互相包含对方类型的属性的结构中必须有一方为归零弱引用。 目前存在双向包含的场景只有在回调中会用到 目标动作回调中储存target对象的属性为weak委托回调中储存delegate委托人的属性为weak除上述两种情况外其他地方默认使用strong修饰属性即可。 5.AUTO类型与释放池 在内存管理中有一种较为特殊的类型叫AUTO类型虽然名字和自动相关但其释放仍需要手动配置释放池来调整。 __autoreleasing:被此种修饰符修饰的对象指针其使用过和使用中的内存在出释放池时才会释放。所以可以通过手动配置自动释放池的位置来调节释放时间。 延迟释放的例子 autoreleasepool {{__autoreleasing Student * stu [[Student alloc] init];}//在此stu的作用域虽然已经结束但stu为AUTO类型所以等代码运行到释放池结束才会释放 } //在此位置内存释放 提前释放的例子 __autoreleasing Student * stu; autoreleasepool {stu [[Student alloc] init]; } //在此位置内存释放虽然stu的作用域没有结束 使用AUTO的类型有两种情况 情况1为对象的便利构造器方法需要延迟释放 (id)student {__autoreleasing Student * stu [[Student alloc] init];return stu; }OC语言规定方法返回的内存必须为AUTO类型。 情况2为在一个封闭循环内用便利构造器创建对象 for(int i 0;i10000;i) { autoreleasepool { __autoreleasing Student * stu [Student student]; } } 因便利构造器返回的对象为AUTO类型所以该对象指针使用的内存只有在出释放池时才会释放。但for循环中无释放池这会造成大量无用的对象无法立即释放。 添加释放池之后内存便可以在使用结束之后立即释放。   [代码展示]   1. Test类的声明 #import Foundation/Foundation.h   interface Test : NSObject   end  Test类的实现   #import Test.h   implementation Test //对象被释放之前要调用的方法 -(void)dealloc {     NSLog(Test被释放。); } end    main #import Foundation/Foundation.h #import Test.h int main(int argc, const char * argv[]) {     //__strong 强引用它会造成对象的引用计数器的变化1     autoreleasepool {                 __strong Test *t2;         {             Test *t [[Test alloc]init];             t2 t;             tnil;             NSLog(2);         }         NSLog(1);     }     NSLog(3);                return 0; } 运行结果 2 1 Test被释放。 3   2. Test类的声明 #import Foundation/Foundation.h   interface Test : NSObject   end Test类的实现 #import Test.h   implementation Test -(void)dealloc {     NSLog(Test被释放); } end main #import Foundation/Foundation.h #import Test.h int main(int argc, const char * argv[]) { //    autoreleasepool { //        //__weak 弱引用不会造成引用计数器的变化同时也不能阻止对象的释放,对象被释放后自动指向了nil //        __weak Test *t2; //        { //            __strong Test *t [[Test alloc]init]; //            t2 t; //            NSLog(%p,t2); //            NSLog(1); //        } //        NSLog(%p,t2); //        NSLog(2); //    }          autoreleasepool {         //__unsafe_unretained 与__weak相同在对象被释放后不会指向nil         __unsafe_unretained Test *t2;         {             __strong Test *t [[Test alloc]init];             t2 t;             NSLog(%p,t2);             NSLog(1);         }         NSLog(%p,t2);         NSLog(2);     }     return 0; } 运行结果 0x100300220 1 Test被释放 0x100300220 2  转载于:https://www.cnblogs.com/lqios/p/4288271.html
http://www.yutouwan.com/news/39561/

相关文章:

  • 网站建设 微盘做网站销售的换工作
  • 企业建设门户网站的需求wordpress cron api
  • 赣榆哪里有做网站的网站留言板漏洞
  • 官方网站建设有限公司自己用电脑网站建设
  • 国家网站备案查询系统深圳坪山新楼盘
  • 甘肃兰州是几线城市九江seo
  • 自己怎么优化网站排名苏州实力做网站公司有哪些
  • 网站后台管理系统背景图片大连建设学校网站院长
  • dw做的网站成品长沙发布app
  • iis应用程序池 网站网页紧急升级
  • 做seo是要先有网站吗管理咨询公司是做什么的
  • 响应式网站建设的应用场景万网虚拟主机上传网站
  • 网站安全狗卸载卸载不掉人工智能 网站建设
  • 电动车行业网站建设好的做问卷调查的网站
  • 山东青岛网站建设seo优化酒店如何做团购网站
  • 有哪些外贸公司网站做的比较好wordpress微信登录开发文档
  • 百度推广 做网站苏州网络技术有限公司
  • 企业建设网站风险多语言企业网站开发
  • 网站与网页的区别与联系有域名就可以做网站吗
  • 怎么创建一个自己的网站能买源码的网站有哪些
  • 高端网站设计制作的张家港网站推广
  • 宁波做网站哪家好数字中国建设峰会 官方网站
  • 网站建设中的安全问题天津网站建设包括哪些
  • 两个网站开发swot分析8x8x域名解析ip地址查询
  • 高端网站建设郑州wordpress安装提示数据库空
  • 做网站网站代理犯法吗视觉设计专业 学校排名
  • 南京哪家做网站好网站内容与标题的区别
  • 网站建设分金手指专业二七专业的网页设计流程
  • 服装行业网站模板wordpress admin theme 下载
  • 国内投资咨询网站 html模板网站流量50g