首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

在非ARC iOS Objective-C代码中使用__weak有什么缺点吗?

在非ARC iOS Objective-C代码中使用__weak有以下缺点:

  1. 需要手动管理内存:在非ARC环境下,使用__weak需要手动管理对象的引用计数,需要手动调用retain和release方法来管理对象的生命周期。这增加了代码的复杂性和出错的可能性。
  2. 可能导致野指针访问:使用__weak修饰的对象在被释放后会自动置为nil,如果在对象被释放后仍然访问该对象,就会导致野指针访问,引发崩溃或不可预测的行为。
  3. 不适用于多线程环境:weak只能在单线程环境下使用,如果在多线程环境下使用weak,可能会导致对象在使用过程中被释放,引发野指针访问或数据竞争等问题。
  4. 不适用于循环引用的解决:weak只能解决简单的循环引用问题,对于复杂的循环引用场景,如A对象持有B对象,B对象持有C对象,C对象又持有A对象,使用weak无法完全解决循环引用问题,需要使用其他方式如使用__unsafe_unretained或手动打破循环引用。

总结起来,使用weak在非ARC iOS Objective-C代码中需要手动管理内存、可能导致野指针访问、不适用于多线程环境和复杂的循环引用场景。在实际开发中,建议尽量使用ARC来自动管理内存,避免使用weak和手动管理内存的方式。

相关搜索:在Docker中使用PYTHONDONTWRITEBYTECODE有什么缺点吗?在开头而不是结尾使用'\n‘有什么缺点吗?在JavaScript中复制冻结的数组有什么缺点吗?在android应用程序中为每个活动使用单独的主题有什么缺点吗在越狱iOS中使用dlsym动态获取常量的代码有什么问题?有什么方法可以在Selenuim中不使用ApacheHttpClientFactory吗?在我的主代码中使用Thread.currentThread.sleep()有什么危险吗?有什么机制可以在代码库中使用多个GOOGLE_APPLICATION_CREDENTIALS吗?在进行AOT编译的Xamarin项目中使用代码混淆有什么优势吗我可以使用netoffice软件包从web应用程序中自动运行outlook应用程序吗?有什么缺点吗?在MS Access中更新数据库值的代码有什么问题吗?在类中为自己的字段使用getter/setter有什么好处吗?在junit5中使用SpringRunner有什么特殊的配置吗?在Redux中-使用store.dispatch()和dispatch()有什么区别吗?有什么原因导致在bash脚本中不能使用UPPER吗?在Cloud Firestore中,在顶级集合和子集合之间建立一个桥接文档有什么真正的缺点吗?在grails 2.0中,如何使用shiro实现BasicHttpAuthentication?有什么很棒的例子吗?在iOS上的Objective-C中,使用合成getter时"self.foo"和"foo"之间的(样式)区别是什么?在PL/SQL代码中,这种布尔变量的分解和使用有什么问题?从db中检索数据并将其显示在php中的表中..看到这段代码有什么问题吗?
相关搜索:
页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

iOS - 老生常谈内存管理:导读

iOS 的内存管理方案哪些? 讲讲 iOS 的内存管理机制 引用计数机制是怎么工作的? 引用计数存储在哪里?以前存储在哪?现在呢? 能聊聊 isa 什么是 nonpointer ?...为什么初始化方法需要 self = [super init]? 你能讲一下 super 的原理ARC 的内存管理规则? ARC 下没有 retain / release 等方法了吗?...Toll-Free Bridged 了解过?详细描述一下。 所有权修饰符哪些? weak 变量在对象被销毁后是如何置为 nil 的,Runtime 是怎样实现它的?...Runtime 为 weak 变量赋值的过程? 既然 __weak 更安全,那么为什么已经了 __weak 还要保留 __unsafe_unretained ? 循环引用是怎么产生的?...什么时候需要自己创建 @autoreleasepool? ARC 环境下,方法里的局部对象什么时候释放? ARC 环境下,autorelease 对象什么时候释放?

62510
  • 16道面试官必问你必须会的iOS面试题

    本例,如果 block 执行代码是通过参数传递进来的话,似乎并没有什么办法可以修改它了。 题目 10:一个 Objective-C 对象的内存结构是怎样的?...题目 11:Objective-C 对象内存结构的 isa 指针是用来做什么的,什么用? Objective-C 是一门面向对象的编程语言。每一个对象都是一个类的实例。...所以,ARC 是工作在编译期的一种技术方案,这样的好处是: 编译之后,ARC ARC 代码是没有什么差别的,所以二者可以源码中共存。...但是也有人认为,ARC 也附带有运行期的一些机制来使 ARC 能够更好的工作,他们主要是指 weak 关键字。weak 变量能够引用计数为 0 时被自动设置成 nil,显然是运行时逻辑工作的。...题目 16:Android 手机通常使用 Java 来开发,而 Java 是使用垃圾回收这种内存管理方式。 那么,ARC 和垃圾回收对比,什么优点和缺点

    2.6K50

    iOS面试题梳理(一)

    目前:iOS 5.0之后引用自动管理机制——自动引用计数(ARC),管理机制与手动机制一样,只是不再需要调用retain、release、autorelease; 它编译时的特性,当你使用ARC时,适当位置插入...5.代理使用unsafe_unretained就相当于assign; 6.block为了避免循环引用问题,使用_weak描述; 7.声明属性时,不要以new开头。...{} 9.ARC只能管理Foundation框架的变量,如果程序把Foundation的变量强制换成Core Foundation的变量需要交换管理权; 10.ARC工程采用ARC去编译某些类...11.ARC下的工程采用ARC去编译某些类:-fno-fobjc-arc。...Reference Counting的简称),ARCIOS5之后推出的新技术,它与GC的机制是不同的。

    1.1K60

    property属性相关小记

    针对目前开发已大多使用ARC自动引用计数技术,因此常用关键字strong、weak、assign、copy、retain、nonatomic、atomic strong:释放旧对象将旧对象的值赋予输入对象...Objective-C对象所占内存总是分配在“堆空间”,且堆内存由开发者释放,即release; 由编译器管理自动释放的,方法定义的变量通常在栈内。...因为他总是超出他的作用域时被自动销毁了 objective-c只支持一个类型对象:block 堆区(heap):一般由程序员分配释放,若程序员不释放,则可能会引起内存泄漏。...注 堆和数据结构的堆栈不一样,其类似于链表。 缺点: 栈对象严格的定义了生命周期也是其主要的缺点,栈对象的生命周期不适于Objective-C的引用计数内存管理方法。...从引⽤用计数表删除废弃对象的地址为键值的记录 ARC下,不显式指定任何属性关键字时,默认关键字哪些?

    1.1K20

    《Objective-C-高级编程》干货三部曲(一):引用计数篇

    总结了Effective Objective-C之后,还想读一本进阶的iOS书,毫不犹豫选中了《Objective-C 高级编程》: ?...现在学习一下ARC机制下的相关知识。 ARCARC机制下的内存管理思想是一致的: 自己生成的对象,自己持有。 自己生成的对象,自己也能持有。 不再需要自己持有的对象时释放对象。...自己持有的对象无法释放。 ARC机制下,编译器就可以自动进行内存管理,减少了开发的工作量。... objc_destroyWeak(&obj1);//释放附有__weak的变量 这确认了weak的一个功能:使用附有weak修饰符的变量,即是使用注册到autoreleasepool的对象。...为什么呢? 因为__weak修饰符只持有对象的弱引用,也就是说将来访问这个对象的时候,无法保证它是否还没有被废弃。

    1.7K40

    深入浅出iOS内存管理-技术创作101训练营

    简答(OC内存) iOS使用引用计数来管理OC对象的内存。iOS 5之前是MRC(手动管理引用计数),iOS 5推出了ARC(自动管理引用计数)。...代码,一般使用dealloc方法来查看一个对象是否被回收,如果没有被回收,则有可能会造成内存泄露。如果确认一个对象已经被释放,那么最后需要将他的变量手动设置为nil,否则可能会造成野指针错误。...ARC 都帮我们做了什么? 说明并比较关键词:strong、weak、assign、copy? Weak、strong、copy、assign 使用?...MRC下retain、assign、copy的修饰词setter方法实现如下图:[1240] 在这里推荐一篇喵神的文章-手把手教你ARC——iOS/Mac开发ARC入门和使用 *** 经过时间的推移,...在这里先推荐一篇对我帮助颇大的文章: iOS管理对象内存的数据结构以及操作算法--SideTables、RefcountMap、weak_table_t *** 结束语 如果您对这篇文章什么意见或者建议

    1.3K54

    iOS 开发:彻底理解 iOS 内存管理(ARC 篇)

    本文是 「iOS 开发:彻底理解 iOS 内存管理」系列的「ARC 篇」。 用来对 Objective-C 语法,自动管理内存 ARC 相关知识进行讲解。 1....ARC 是新的 LLVM 3.0 编译器的一项特性,使用 ARC,可以说一 举解决了广大 iOS 开发者所憎恨的手动内存管理的麻烦。...那有了 __weak,为什么还有 __unsafe_unretained 呢? __unsafe_unretained 主要是跟 C 语言代码相互。...此外,__weak 会消耗一定的性能,使用 __weak 需要检查对象是否被释放,追踪是否被释放的时候需要追踪一些信息,则使用 __unsafe_unretained 比 __weak 快,消耗 CPU...weak @property (nonatomic, weak) Person *owner; @end 参考资料 【书籍】Objective-C 高级编程 iOS 与 OS X 多线程和内存管理 【

    57410

    iOS 面试策略之语言工具-Objective-C

    Objective-C 是苹果为 iOS 和 Mac 开发量身定制的语言。它随着 iPhone 的出现而大火,直到今天国内外大多数的 App 依然是用 Objective-C 写。...本章将探讨 Objective-C 的基本语言特性,其动态特性将与 Swift 比较设计。 Objective-C 面试理论题 1.什么ARC?...类似问题: atomic 是百分之百线程安全的? 5.runloop 和线程什么关系?...7.什么是 block?它和代理的区别是什么? 关键词:#回调 iOS 开发,block 和代理都是回调的方式。...runloop 的 mode 主要用来指定事件 runloop 的优先级,以下几种: Default(NSDefaultRunLoopMode):默认,一般情况下使用; Connection(NSConnectionReplyMode

    67520

    IOS6学习笔记(三)

    这意味着以下几行代码声明的变量其值并不等于零:   int a;   int b; 2.Objective-C命名约定   如果你Person对象写了一个叫做newPersonName的方法,ARC...使用ARC(或者不适用ARC)编译过的调用代码和方法newPersonName运行时一切正常。但是如果这一方法所在的类没有使用ARC编译而调用方法使用ARC编译,程序就会奔溃。...-(NSString *)newPersonName NS_RETURNS_NOT_RETAINED;  4.自由桥接   与Objective-C库不同,我们Objective-C使用的标准C语言和...ARC,__block引用会被保留而不是被复制,这意味着ARC环境前面的代码仍然会引发循环保留。...正确地方法是使用__weak或(__unsafe_unretained)引用,如:   使用__weak避免循环保留(ARC)     __weak typeof(self) safeSelf = self

    71590

    ARC(Automatic Reference Counting )技术概述

    这里我把此技术翻译为自动内存计数器管理技术,下图是使用和不使用此技术的Objective-C代码的区别。 ?...ARC技术是随着XCode4.2一起发布的,缺省工程模板,你可以指定你的工程是否支持ARC技术,如果你不指定工程支持ARC技术,代码你必须使用管理内存的代码来管理内存。...ARC在编译期间为每个Objective-C指针变量添加合适的retain, release, autorelease等函数,保存每个变量的生存周期控制合理的范围内,以期实现代码上的自动内存管理。...ARCXcode4.2引入,Mac OS X v10.6,v10.7 (64位应用),iOS 4,iOS 5支持,Xcode4.1不支持这个技术....不能在C语言中的结构中使用Objective-c的类的指针。 请使用类类管理数据。 不能使用NSAutoreleasePool.

    1.6K160

    【面试】阿里 iOS 开发实习电话面试记录(二)

    iOS 相关的问题: (我简历上写自己独立开发了几个 App)说一下你自己做的那个 App(随便挑了一个) (我大概阐述了产品方向之后,他问我技术上最难的是什么,然后随口提到了要保存图片到相册) 关于...iOS 系统相册,哪些相关方案可以获取?...Objective-C 高级编程 同类型的问题还有 assign、weak 的区别,ARC 如何实现,编译时、运行时区别,weak 属性的对象废弃后 指针是如何指向 nil 的…… 平时了解一些架构...(虽然这个东西大家都在用,但是查一下还是能查出来一些自己不知道的,心里没底的,建议现在就去 Google 一下) 你平时做 App 之后,什么推广途径?...(其中我提到了一些推广平台,国内的 36Kr 的 NEXT、爱范儿的 MindStore 和 AppSo,国外的 ProductHunt,好像他听的时候还在一边拿笔记,人家也还在学习啊~)

    72430

    浅谈 iOS ARC 内存管理

    Objective-C 采用的是引用计数式的内存管理方式: 自己生成的对象自己持有。 自己生成的对象自己也能持有。 自己持有的对象不再需要时释放。 自己持有的对象自己无法释放。...__weak 最常见的一个作用就是用来避免强引用循环。 __weak 的几个使用场景: Delegate 关系防止强引用循环。...其实这个 assign ARC 中意义等同于 __unsafe_unretained(后面会讲到),它是为了 ARC 特性下兼容 iOS4 及更低版本来实现弱引用机制。...__unsafe_unretained ARC iOS5 引入的,而 __unsafe_unretained 这个修饰符主要是为了 ARC 刚发布时兼容 iOS4 以及版本更低的系统,因为这些版本没有弱引用机制...__unsafe_unretained 的应用场景: ARC 环境下但是要兼容 iOS4.x 的版本,用 __unsafe_unretained 替代 __weak 解决强引用循环的问题。

    1.4K41

    Objective-c 知识总结 -- @property

    ( 仅 ARC 可用 )【默认值】 —— weak 弱引用,不持有对象 ( 仅 ARC 可用 ) —— copy 拷贝副本 原子性操作类 nonatomic 原子性操作,线程不安全 —— atomic...属性访问方式 访问的方式: 通过直接使用实例变量 使用编译器提供的点运算符,实现属性存取方法的调用,从而间接使用实例变量; 注意:id 类型的变量不能使用点操作符进行访问,原因是 Xcode 不知道是否存在对应的存取方法...setter、getter 方法不变; 补充:如果声明的属性多个是需要 nonnull 修饰的话,可以使用一对宏来简化属性代码: // NS_ASSUME_NONNULL_BEGIN #define...,null_unspecified Xcode 8 开始使用,并能写进 @property 的选项列表; Ep【 Xcode 7, iOS 9】: #import "ViewController.h"...不过这么做编译器会报错,但是只要新建一个该类的类别,类别.h文件写上原始类该方法的声明,类别.m文件什么也不写,就可以正常调用私有方法了。这就是传说中的私有方法前向引用。

    1.4K31

    strong,weak, retain, assign的区别@property的参数

    OC:默认对对象都是强引用;如果对象没有强引用会被立即释放 assign:基本数据类型,结构体,枚举,OC对象类型 以下扯淡的比较多 strong与weak是由ARC新引入的对象变量属性 xcode...4.2(ios sdk4.3和以下版本)和之前的版本使用的是retain和assign,是不支持ARC的。...xcode 4.3(ios5和以上版本)之后就有了ARC,并且开始使用strong与weak strong,weak, retain, assign的区别 assign assign: 用于指针变量。...weak 就是相当于assign,同样可以xcode4.3开发环境下放弃使用assign 使用weak 来代替 unsafe_unretained unsafe_unretained 就是ios5版本以下的...因为 ios5用的是 weak ,那ios4.3就用不了,如果你将 weak 修改为 unsafe_unretained ,那就可以用了。

    1.7K100
    领券