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

微信网站制作软件织梦cms 做视频网站

微信网站制作软件,织梦cms 做视频网站,网站的设计技术策划,黑科技软件网站如何使用关联对象给分类实现一个weak的属性 通过关联对象objc_setAssociatedObject中的策略policy可知#xff0c;并不支持使用weak修饰对象属性#xff1a; typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {OBJC_ASSOCIATION_ASSIGN 0, //assignOBJC_ASSOCIATION…如何使用关联对象给分类实现一个weak的属性 通过关联对象objc_setAssociatedObject中的策略policy可知并不支持使用weak修饰对象属性 typedef OBJC_ENUM(uintptr_t, objc_AssociationPolicy) {OBJC_ASSOCIATION_ASSIGN 0, //assignOBJC_ASSOCIATION_RETAIN_NONATOMIC 1, //strong, nonatomicOBJC_ASSOCIATION_COPY_NONATOMIC 3, //copy, nonatomicOBJC_ASSOCIATION_RETAIN 01401, //strong, atomicOBJC_ASSOCIATION_COPY 01403 //copy, atomic };思考能否用assign实现 weak和assign的区别如下 **assign**对应的所有权类型为__unsafe_unretained当修饰对象的时候修饰的指针指向该对象不会去持有该对象也不会使retainCount 1而在指向的对象被释放时依然指向原来的对象地址不会被自动置为nil所以造成了野指针是不安全的**weak**弱引用不会影响对象的释放而当对象被释放时引用计数为0所有指向它的弱引用都会自定被置为nil防止野指针之后再向该对象发消息也不会崩溃weak是安全的 看以下测试代码使用policy为OBJC_ASSOCIATION_ASSIGN的策略会发生什么样的情况 //定义Person类 interface Person : NSObject end implementation Person - (void)dealloc {NSLog(Person dealloc); } endinterface Person (Test) //在分类中声明UIViewController属性用assign修饰 property(assign, nonatomic) UIViewController *viewController; endimplementation Person (Test) - (void)setViewController:(UIViewController *)viewController {//利用objc_setAssociatedObject设置值policy为OBJC_ASSOCIATION_ASSIGNobjc_setAssociatedObject(self, selector(viewController), viewController, OBJC_ASSOCIATION_ASSIGN); } - (UIViewController *)viewController {//取值return objc_getAssociatedObject(self, _cmd); } end使用assign修饰对象当离开作用域后产生野指针访问Crash如图如何避免这个问题 1、通过中间对象的方式 1.1、利用OBJC_ASSOCIATION_RETAIN_NONATOMIC weak来实现 创建中间类 interface WeakObjWrapper : NSObject property(weak, nonatomic) id weakObj; end implementation WeakObjWrapper - (instancetype)initWithWeakObject:(id)weakObj {if (self [super init]) {_weakObj weakObj;}return self; } end实现属性的setter和getter interface Person (Test) property(weak, nonatomic) UIViewController *viewController; end implementation Person (Test) - (void)setViewController:(UIViewController *)viewController {WeakObjWrapper *warpper objc_getAssociatedObject(self, selector(viewController));//用warpper保存传递进来的值if (!warpper) {//warpper不存在则创建warpper [[WeakObjWrapper alloc] initWithWeakObject:viewController];}else {//已经存在直接赋值warpper.weakObj viewController;}//保存的实际上是warpper对象objc_setAssociatedObject(self, selector(viewController), warpper, OBJC_ASSOCIATION_RETAIN_NONATOMIC); }- (UIViewController *)viewController {//获取到warpperWeakObjWrapper *warpper objc_getAssociatedObject(self, _cmd);//取出warpper中的值return warpper.weakObj; } endobjc_setAssociatedObject实际上存储的是WeakObjWrapper对象对WeakObjWrapper对象产生强引用WeakObjWrapper对象内部弱持有传递进去的值保证在对象释放的时候自动把值设置为nil避免了崩溃 1.2、借助OBJC_ASSOCIATION_COPY_NONATOMIC和弱引用block -(void)setWeakvalue:(NSObject *)weakvalue {__weak typeof(weakvalue) weakObj weakvalue;typeof(weakvalue) (^block)() ^(){return weakObj;};objc_setAssociatedObject(self, weakValueKey, block, OBJC_ASSOCIATION_COPY_NONATOMIC); } -(NSObject *)weakvalue {id (^block)() objc_getAssociatedObject(self, weakValueKey);return block(); }2、借助runtime 继续使用OBJC_ASSOCIATION_ASSIGN利用runtime动态的创建传进去值的类的子类在子类的dealloc中将objc_setAssociatedObject中的value设置为nil销毁并移除了关联对象避免Crash具体实现如下具体使用已在注释中说明 void weak_setAssociatedObject(id _Nonnull object,const void * _Nonnull key,id _Nullable value) {//派生一个子类类名为WeakObjWrappervalue对应的类名const char *clsName [[NSString stringWithFormat:WeakObjWrapper%, [value class]] UTF8String];//获取派生的子类Class childCls objc_getClass(clsName);//如果子类不存在利用runtime动态的创建一个子类if (!childCls) {childCls objc_allocateClassPair([value class], clsName, 0);objc_registerClassPair(childCls);}//注册dealloc方法SELSEL sel sel_registerName(dealloc);//获取dealloc对应的类型编码const char *deallocEncoding method_getTypeEncoding(class_getInstanceMethod([value class], sel));// 注意内部持有value此处需要弱引用处理一下__weak typeof(value) weakValue value;// 创建一个指向在调用dealloc方法时调用指定block的函数指针IMP deallocImp imp_implementationWithBlock(^(id _childCls) {//在子类的dealloc方法中将value设置为nil避免崩溃objc_setAssociatedObject(object, key, nil, OBJC_ASSOCIATION_ASSIGN);//派生的子类的dealloc方法会被调用父类的不再被调用故在此处调用一下父类的((void (*)(id, SEL))(void *)objc_msgSend)(weakValue, sel);});//给子类添加dealloc方法class_addMethod(childCls, sel, deallocImp, deallocEncoding);//将value对应的isa指向子类object_setClass(value, childCls);//设置关联对象objc_setAssociatedObject(object, key, value, OBJC_ASSOCIATION_ASSIGN); }注意在派生的子类添加的实现dealloc的方法中重新调用一下父类的dealloc保证原有的类的释放关系不被破坏调用实现属性的getter和setter interface Person (Test) property(assign, nonatomic) UIViewController *viewController; end implementation Person (Test) - (void)setViewController:(UIViewController *)viewController {weak_setAssociatedObject(self, selector(viewController), viewController); } - (UIViewController *)viewController {return objc_getAssociatedObject(self, _cmd); } end总结 关联对象中如何实现weak属性 关联对象objc_setAssociatedObject中的策略policy可知并不支持使用weak修饰对象属性可以借助中间类OBJC_ASSOCIATION_RETAIN_NONATOMIC weak来实现也可以继续使用OBJC_ASSOCIATION_ASSIGN利用runtime动态的创建传进去值的类的子类在子类的dealloc中将objc_setAssociatedObject中的value设置为nil销毁并移除了关联对象从而避免了Crash 参考1https://www.cnblogs.com/huangzs/p/14479408.html 参考2https://developer.aliyun.com/article/1321927#:~:text1%20关联对象objc_setAssociatedObject中的策略policy可知并不支持使用weak修饰对象属性%202%20可以借助中间类OBJC_ASSOCIATION_RETAIN_NONATOMIC,%2B%20weak来实现%203%20也可以继续使用OBJC_ASSOCIATION_ASSIGN利用runtime动态的创建传进去值的类的子类在子类的dealloc中将objc_setAssociatedObject中的value设置为nil销毁并移除了关联对象从而避免了Crash
http://www.zqtcl.cn/news/552873/

相关文章:

  • 适合手机的网站免费做二建题的网站
  • 用阳寿做交易的网站做网站公司 陕西渭南
  • 携程旅行网网站策划书外贸网站如何做seo
  • 网站网站制作需要多少钱沧州新增最新
  • 有什么做兼职的网站wordpress 视频站模版
  • 做信息图的网站有哪些网站建设百度经验
  • zhihe网站建设 淘宝龙岗网站建设哪家好
  • 微信h5商城网站枣庄建设工程管理局网站
  • 做弹弓教程网站旺道seo怎么优化网站
  • 监理公司宣传册设计样本杭州优化seo公司
  • 佛山优化网站关键词衡水专业做网站
  • 京东alexa排名seo发外链网站
  • 中国工业设计网站制作网页版权怎么修改
  • 贞丰县建设局网站一般的电脑培训班要多少钱
  • 模板网站建设清单太原网站制作电话
  • 网站建设的需求要素设计企业网站机
  • 深圳百度推广电话西安官网seo技术
  • 沈阳建站免费模板福州建设企业
  • 怎么在百度首页做网站wordpress返回前页
  • 张家口城乡建设局网站wordpress 等待响应
  • 专门设计网站的公司叫什么怎么做网站多少钱
  • 淡水网站建设健身器材 网站模版
  • 河南建设网站公司简介做新闻类网站需要什么资质
  • 网络文化经营许可证图片下载优化大师安装桌面
  • 网站cms系统教育网站开发文档
  • 用网站做淘客怎么做网站建设在电访销售话术
  • 做电影网站赚了几百万动画制作流程
  • 怎么做企业的网站首页wordpress 主机迁移
  • 网站常见问题网页设计代码开头
  • 聊城网站推广品牌推广计划描述