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

使用ARC的原始数据类型的合成属性 - 弱或分配?

使用ARC的原始数据类型的合成属性 - 弱或分配?

这个问题涉及到ARC(Apple Reference Counting)的原始数据类型的合成属性,以及弱引用和分配。

在Objective-C中,ARC是一种自动引用计数机制,它可以自动管理内存,避免内存泄漏和循环引用等问题。在使用ARC时,可以使用原始数据类型的合成属性,例如:

代码语言:txt
复制
@property (nonatomic, assign) int age;

这里的assign关键字表示使用原始数据类型的合成属性,即直接将值赋给变量,而不是创建一个新的对象。

在这种情况下,可以选择使用弱引用或分配。弱引用表示不会增加对象的引用计数,当对象被释放时,弱引用会自动变为nil。这可以避免循环引用导致的内存泄漏。例如:

代码语言:txt
复制
@property (nonatomic, weak) id<MyProtocol> delegate;

分配表示直接将值分配给变量,而不是创建一个新的对象。例如:

代码语言:txt
复制
@property (nonatomic, assign) id<MyProtocol> delegate;

在这种情况下,如果对象被释放,它的引用计数会减少,但是如果没有其他引用,它的内存会被释放,导致崩溃。因此,在使用分配时,需要确保对象的生命周期与变量的生命周期相匹配。

总之,在使用ARC的原始数据类型的合成属性时,可以选择使用弱引用或分配。弱引用可以避免循环引用导致的内存泄漏,但是需要注意对象的生命周期;而分配可以直接将值分配给变量,但是需要确保对象的生命周期与变量的生命周期相匹配。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Swift基础 自动参考计数

但是,如果ARC要处理仍在使用实例,将无法再访问该实例属性调用该实例方法。事实上,如果您尝试访问该实例,您应用程序很可能会崩溃。...相比之下,当另一个实例具有相同生命周期更长生命周期时,请使用非拥有的引用。 引用 引用是一种引用,它不会强烈保留它所指实例,因此不会阻止ARC处理引用实例。...然而,与引用不同,当另一个实例具有相同更长生命周期时,会使用非拥有引用。您可以通过将非unowned关键字放在属性变量声明之前来指示非所有引用。 与引用不同,无拥有引用应该始终具有值。...您还看到了如何使用引用和无名引用来打破这些强引用周期。 如果您为类实例属性分配闭包,并且该闭包主体捕获实例,也可能发生强引用周期。...此属性引用将name和text组合成HTML字符串片段闭包。asHTML属性类型为()->String,“不接受参数并返回String值函数”。

11200

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

分配内存空间地址越来越小,由编译器来进行管理。 堆:通过alloc、malloc、calloc等动态分配空间,分配内存空间地址越来越大,由开发者进行管理。...*** 面试题(ARC 强/引用 & LLVM) 在上面问题基础上会引出这些问题: 什么是ARCARC是为了解决什么问题诞生)? ARC通过什么方式帮助开发者管理内存?...简答(ARC 强/引用) 我是15年开始入坑iOS开发,从Xcode 5学起,当时大多数项目还都是MRC项目,其中最有名还数ASIHTTPRequest库,MRC下需要手动进行引用计数管理,不乏就要写大量...ARC只负责管理Objective-c 对象内存,CoreFoundation 对象不归ARC管理。基础数据类型不需要内存管理。...在Objective-C中,基本数据类型默认关键字为atomic,readwrite,assign;普通属性默认关键字为atomic,readwrite和strong。

1.3K54
  • property属性相关小记

    针对目前开发中已大多使用ARC自动引用计数技术,因此常用关键字有strong、weak、assign、copy、retain、nonatomic、atomic strong:释放旧对象将旧对象值赋予输入对象...引用 在VC中,VCview就是tableview,相当于VC强引用着tableview。...栈区(stack):由编译器自动分配释放,存放函数参数值,局部变量等值。其操作方式类似于数据结构中栈。 栈对象: 优点: 1.高速,在栈上分配内存是非常快。...从引⽤用计数表中删除废弃对象地址为键值记录 ARC下,不显式指定任何属性关键字时,默认关键字有哪些?...编译通过,执行时才执行相应方法,即所谓动态绑定。 @synthesize合成实例变量规则 a. 若指定了成员变量名称,则会生成一个指定名称成员变量 b.

    1.1K20

    如何在Linux使用 chattr 命令更改文件目录扩展属性

    在 Linux 操作系统中,chattr 命令用于更改文件目录扩展属性,包括可写性、可执行性和删除性等。本文将介绍 chattr 命令使用方法以及常见参数。...例如,我们可以使用以下命令将 file.txt 设置为可恢复:$ chattr +u file.txt运行命令后,如果我们修改了 file.txt,可以使用以下命令恢复原始文件内容:$ lsattr...输入 yes 后,文件系统将会恢复 file.txt 原始内容。要取消文件可恢复属性,我们可以使用以下命令:$ chattr -u file.txt4....总结本文介绍了 chattr 命令使用方法及常见参数。我们可以使用 chattr 命令更改文件目录扩展属性,包括可写性、可执行性和删除性等。常见属性包括 a、i、d 和 u 等。...我们可以根据实际需求选择相应属性,从而更好地保护文件目录。

    3.7K20

    iOS - 老生常谈内存管理(三):ARC 面世

    同MRC,父对象对它子对象持有强引用,而子对象对父对象持有引用。 在ARC中,“引用” 是指__weak__unsafe_unretained。...“直接赋值” 实例变量变成强引用了。 在ARC之前,实例变量是引用(非持有引用) —— 直接将对象分配给实例变量并不延长对象生命周期。...为了使属性变strong,你通常会实现使用@synthesize合成 “调用适当内存管理方法” 访问器方法。相反,有时你为了维持一个引用,你可能会像以下实例这样实现访问器方法。...若要保持与MRC下一致,必须将实例变量使用__weak修饰,使用weak关键字属性。...分配内存区域必须初始化为 0(zero-filled)。 在free数组之前,必须将每个元素赋值为nil(memsetbzero将不起作用)。 你应该避免使用memcpyrealloc。

    2.1K10

    iOS中assign、retain、copy、weak、strong区别以及nonatomic含义

    assign: assign一般用来修饰基本数据类型,包括基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等),为什么呢?...但是,即使被释放,指针却还在,成为了野指针,如果新对象被分配到了这个内存地址上,又会crash,所以一般只用来声明基本数据类型,因为它们会被分配到栈上,而栈会由系统自动处理,不会造成野指针。...以上三个可以在MRC中使用,但是weak和strong就只能在ARC使用,也就是自动引用计数,这时就不能手动去进行retain、release等操作了,ARC会帮我们完成这些工作。...weak: weak其实类似于assign,叫引用,也是不增加引用计数。一般只有在防止循环引用时使用,比如父类引用了子类,子类又去引用父类。...strong: 相对,strong就类似与retain了,叫强引用,会增加引用计数,类内部使用属性一般都是strong修饰,现在ARC已经基本替代了MRC,所以我们最常见就是strong了。

    27110

    iOS基础·属性修饰词与setter关系

    age 3.2.4 用法场景 当你在子类中重载了父类中属性,你必须使用@synthesize来手动合成实例变量。...4.1.3 使用场景 常用于基本数据类型(NSInteger)和C数据类型(int、float、double、char以及id类型。...4.4 weak weak、strong是ARC出现后才出现概念,但这并不代表weak、strong这两个修饰都不能在MRC模式下使用。事实上,strong在MRC模式依旧可使用。...4.4.1 基本特性 weak 用来修饰强引用属性,类似于对应原来assign。 weak是一种引用,并不会使对象引用计数加1,可以避免循环引用问题。 不保留传入对象。...4.4.2 两种模式下 MRC模式 weak: MRC模式下无法使用 ARC模式 weak: 引用,不会使对象引用计数器加1。

    1.1K20

    iOS 内存管理相关面试题

    对基础数据类型 (NSInteger ,CGFloat )和C数据类型(int , float , double , char , 等等) 3.3 原子性(多线程管理): atomic 默认属性,访问方法都为原子型事务访问...__unsafe_unretained 引用 当对象被释放时指针不会被自动赋值为 ni 在ARC属性修饰符是可以用 assign (相当于 __unsafe_unretained) 在ARC属性修饰符是可以用...相反,如果这N个指针都是引用,这个对象马上就被释放 在使用 sb 或者 xib 给控件拖线时候,为什么拖出来属性都是用 weak 修饰呢?...通过alloc、newmalloc获得内存在堆中分配,堆中内存需要写相应代码释放。如果进程结束了在堆中分配内存会自动释放。...{}块 把assign属性变为weak使用ARC一些强制规定 dealloc方法来管理一些资源,但不能用来释放实例变量,也不能在dealloc方法里面去掉[super dealloc]方法,在ARC

    1.5K30

    Objective-c 知识总结 -- @property

    属性是指对象特性。 属性声明? 属性声明是一种声明变量为属性语法。 属性实现? 声明了实例变量定义了相应访问方法(存取方法)即为实现了属性。...( 仅 ARC 可用 )【默认值】 —— weak 引用,不持有对象 ( 仅 ARC 可用 ) —— copy 拷贝副本 原子性操作类 nonatomic 非原子性操作,线程不安全 —— atomic...属性访问方式 访问方式有: 通过直接使用实例变量 使用编译器提供点运算符,实现属性存取方法调用,从而间接使用实例变量; 注意:id 类型变量不能使用点操作符进行访问,原因是 Xcode 不知道是否存在对应存取方法...; ---- 二、属性声明自动合成 ?...- (NSObject *)obj{ return _obj ; } weak 变量不被持有,对应对象会被引用与 strong 相对; weak 只能用于 ARC ,weak

    1.4K31

    iOS_理解Block(代码块)+底层实现

    三、Block捕获变量+底层实现 1、未捕获变量 2、捕获基本数据类型 3、捕获alloc变量 4、捕获静态局部变量 5、`__block`捕获变量 四、Block导致循环引用 1、MRC时代 2、ARC...与int、floatObjective-C对象一样,也可以把块复制给变量,然后像使用其他变量那样使用它。块类型语法与函数指针近似。...2、捕获基本数据类型 ​ 写一个使用基本数据类型block如下: int a = 1; void(^aBlock)(void) = ^{ NSLog(@"%d", a); } aBlock(); ​...@", name); } aBlock(); ​ 继续使用terminal转换为底层实现代码如下: 结构如下图: ​ 跟上一个捕获alloc变量对比,捕获静态变量使用是 指向指针指针,所以可以直接使用修改静态变量值...时代 ​ ARC模式出来后就有了weak,这时应该使用__weak来避免循环引用: __weak typedof(self) weakSelf = self; // 引用 void (^aBlock)

    55320

    精选面试题教你应对高级iOS开发面试官(提供底层进阶规划蓝图)

    1、ARC中,有可能出现循环引用地方使用,比如:delegate 属性 2、自定义IBOutlet控件属性一般也是使用weak 区别: weak表明一种非持有关系,必须用于OC对象;assign用于基本数据类型...1、在protocol中使用property只会生成 setter和 getter方法声明,使用属性目的,是希望遵守该协议对象能实现该属性 2、category使用@property 也是只会生成...不需要,在ARC环境无论是强指针还是指针都无需在 dealloc设置为 nil,ARC 会自动帮我们处理,即便是编译器不帮我们做这些,weak也不需要在dealloc中置nil,runtime内部已经帮我们实现了...假如 property 名为 foo,存在一个名为_foo实例变量,那么还会自动合成新变量么?不会。 在有了自动合成属性实例变量之后,@synthesize还有哪些使用场景?...时 在@protocol中定义所有属性 在category中定义所有属性 重载属性,当在子类中重载了父类中属性,必须使用@synthesize来手动合成ivar objc中向一个nil对象发送消息将会发生什么

    53300

    【iOS面试粮食】内存管理

    本文章将记录Objective-C中内存管理相关资料,如有错误欢迎指出~ iOS内存管理一般指的是OC对象内存管理,因为OC对象分配在堆内存,堆内存需要程序员自己去动态分配和回收;基础数据类型(...引用计数 不管是MRC 还是 ARC ,都是通过对引用计数来进行内存管理。...当一个对象使用完没有释放,此时其引用计数永远大于1。该对象就会一直占用其分配在堆内存空间,就会导致内存泄露。内存泄露到一定程度有可能导致内存溢出,进而导致程序崩溃。...下图是 4 个对象形成循环引用问题。 那该怎么解决循环引用问题呢?使用引用 (weak reference) 办法。...引用 使用引用来持有对象,引用虽然持有对象,但是并不增加引用计数,这样就避免了循环引用产生。 在 iOS 开发中,引用通常在 delegate 模式中使用

    53100

    OC - 属性关键字和所有权修饰符

    1.3 内存管理 属性关键字 用法 assign 1.setter 方法实现是直接赋值,一般用于基本数据类型 。...这时候如果继续通过指针访问原对象的话,会由于悬垂指针原因产生内存泄漏程序异常)。 weak 1.ARC 下才能使用。2.修饰引用,不增加对象引用计数,主要可以用于避免循环引用。...retain 1.MRC 下使用ARC 下基本使用 strong。2.修饰强引用,将指针原来指向旧对象释放掉,然后指向新对象,同时将新对象引用计数加1。...2.编译器将为 strong、retain、copy 修饰属性生成带 __strong 所有权修饰符实例变量。 __weak 1.引用持有对象,对应 weak 关键字,ARC下用来防止循环引用。...1.ARC 中为了避免循环引用而使用,可以让相互引用对象中一个使用weak/__weak引用修饰,常用于对delegate和block修饰; 2.Interface Builder 中 IBOutlet

    1.3K31

    swift 自动引用计数

    ARC 会在类实例不再被使用时,自动释放其占用内存 引用计数仅仅应用于类实例。...结构体和枚举类型是值类型,不适应 自动引用计数(表示对象被引用次数) 1、每创建一个类实例对象,ARC就会分配一块内存来存储实例信息(实例类型信息及实例存储属性) 2、当实例不再被使用时,ARC...释放实例所占用内存,这确保了不再被使用实例,不会一直占用内存空间 3、当 ARC 释放了正在被使用实例,该实例属性和方法将不能再被访问和调用。...实际上,如果你试图访问这个实例,你应用程序很可能会崩溃 4、为了确保使用实例不会被销毁,ARC 会跟踪和计算每一个实例正在被多少属性,常量和变量所引用。...跟解决两个类实例间循环强引用一样,声明每个捕获引用为引用无主引用 定义捕获列表 捕获列表中每一项都由一对元素组成,一个元素是weakunowned关键字,另一个元素是类实例引用(例如self

    16910

    【iOS 开发】Objective - C 面向对象 - 方法 | 成员变量 | 隐藏封装 | KVC | KVO | 初始化 | 多态

    合成存取方法 (1) @property 和 @synthesize 指令 自动 合成 getter 和 setter 方法 :  -- 合成方法 : 接口部分使用 @property 指令定义属性,...double 结构体 等数据类型;  -- 引用计数 : 对象引用计数大于 0 时, 该对象不会被回收, 基础数据类型不存在回收问题, 可以使用 assign 指示符; (2) atomic (nonatomic...定义属性, 将某个对象赋值给该属性时, 该属性原来所引用对象引用计数 -1, 被赋值对象 (成员变量) 引用计数 +1; -- 使用场景 : 在未启用 ARC 机制情况下, 常用, 启用后不常用;..., 只要该强引用指向被赋值对象, 那么该对象就不会自动回收; weak 指示符 : 指定该属性对被赋值对象持有引用, 引用指向被赋值对象, 该对象可能被回收; (8) unsafe_unretained...Coding (KVC); -- KVC 使用前提 : 最好在接口部分使用 @property 实现类部分使用 @synthesize 合成存取方法, 也可以只定义 "_属性名" "属性名" 成员变量

    83810

    基础篇-ObjectC继承、类别、属性

    dynamic都没写,那么默认就是@syntheszie var = _var; 我们来看一下属性本质和进化过程: 原始形态:     定义一个实例变量:int age;     先在.h文件中声明...而这种 机制是耗费系统资源 assign   此标记说明设置器直接进行赋值 ,赋值特性,不涉及引用计数,引用对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float...iOS 5 中对属性设置新增了strong 和weak关键字来修饰属性(iOS 5 之前不支持ARC) strong   用来修饰强引用属性,一块内存(一个对象)当没有 strong 类型指针指向它时...,它就会被释放;ARC使用,与MRC中retain同义,使用之后,计数器+1。...weak    用来修饰引用属性,当一块内存(一个对象)被释放时,指向它 weak 类型指针就会被释放并赋值为 nil。

    1.9K10

    开心档之计数(ARC

    Swift 自动引用计数(ARC) Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类实例不再被使用时,自动释放其占用内存...ARC 功能 当每次使用 init() 方法创建一个类实例时候,ARC分配一大块内存用来储存实例信息。 内存中会包含实例类型信息,以及这个实例所有相关属性值。...当实例不再被使用时,ARC 释放实例所占用内存,并让释放内存能挪作他用。 为了确保使用实例不会被销毁,ARC 会跟踪和计算每一个实例正在被多少属性,常量和变量所引用。...实例赋值给属性、常量变量,它们都会创建此实例强引用,只要强引用还在,实例是不允许被销毁。...对于生命周期中会变为nil实例使用引用。相反,对于初始化赋值后再也不会被赋值为nil实例,使用无主引用。

    61920

    .NETC# 使用 ConditionalWeakTable 附加字段(CLR 版本附加属性,也可用用来当作引用字典 WeakDictionary)

    如果你使用过 WPF/UWP 等 XAML UI 框架,那么应该了解到附加属性概念。那么没有依赖属性支持时候如何做附加属性功能呢?你可能会想到引用。...---- 这不是字典 现成可用引用字典,即 ConditionalWeakTable。然而实际上这个类原本作用并不是当作字典使用!...如果你使用过 WPF/UWP 等 XAML UI 框架,那么应该了解到附加属性概念。这其实是 .NET 为我们提供一种附加字段机制。...虽然它不是引用字典,但能解决此类问题,同时也能当作一个引用字典来使用,仅此而已。...这意味着当你使用它来为一个类型附加一些字段或者属性时候完全不用担心内存泄漏问题。

    19710

    开心档之Swift 自动引用计数(ARC

    Swift 自动引用计数(ARC) Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类实例不再被使用时,自动释放其占用内存...ARC 功能 当每次使用 init() 方法创建一个类实例时候,ARC分配一大块内存用来储存实例信息。 内存中会包含实例类型信息,以及这个实例所有相关属性值。...当实例不再被使用时,ARC 释放实例所占用内存,并让释放内存能挪作他用。 为了确保使用实例不会被销毁,ARC 会跟踪和计算每一个实例正在被多少属性,常量和变量所引用。...实例赋值给属性、常量变量,它们都会创建此实例强引用,只要强引用还在,实例是不允许被销毁。...对于生命周期中会变为nil实例使用引用。相反,对于初始化赋值后再也不会被赋值为nil实例,使用无主引用。

    55120
    领券