Objective-C - 弱属性 - getter autoreleases(自动引用计数)

2024-01-07

我有疑问weakARC 中的属性(自动引用计数)

我的理解(如有错误请指正):

weak属性的行为类似于assign属性,但当该属性指向的实例被销毁时,ivar 会指向 nil。

问题:

  1. 我只是觉得吸气剂weak属性保留和自动释放。它不是应该像 getter 一样表现吗?assigngetter 不保留和自动释放的属性?(请参考程序)

Program:

我在下面给出了程序的实际输出和我的预期输出。

Note - 当我更改财产时weak to assign我的预期输出得到满足

#import<Foundation/Foundation.h>

@interface A : NSObject
- (void) dealloc;
@end

@implementation A
- (void) dealloc
{
    printf("\tinstance of A deallocated = %p\n", self);
}
@end

@interface B : NSObject
@property (weak) A* xa1;
- (void) dealloc;
@end

@implementation B
@synthesize xa1;
- (void) dealloc
{
    printf("\tinstance of B deallocated = %p\n", self);
}
@end


int main()
{
    B* b1 = [[B alloc] init];

    @autoreleasepool                        //autoreleasepool 1
    {   
        {                                   //block 1
            A* a1 = [[A alloc] init];
            printf("\ta1 = %p\n", a1);

            b1.xa1 = a1; 

            A* a3 = b1.xa1;

            printf("--- end of block 1\n");
        }                                       //at this point i expected instance pointed by a1 to be destroyed

        printf("--- end of autoreleasepool 1\n");
    }   

    printf("---- end of main\n");

    return(0);
}

实际输出:

    a1 = 0x10d713f50
--- end of block 1
--- end of autoreleasepool 1
    instance of A deallocated = 0x10d713f50
---- end of main
    instance of B deallocated = 0x10d713d30

我的预期输出:

    a1 = 0x10d713f50
--- end of block 1
    instance of A deallocated = 0x10d713f50
--- end of autoreleasepool 1
---- end of main
    instance of B deallocated = 0x10d713d30

Thanks


供应weak在财产上假设__weakivar 的所有权,即它只是一个指令@synthesize.

根据http://clang.llvm.org/docs/AutomaticReferenceCounting.html http://clang.llvm.org/docs/AutomaticReferenceCounting.html§4.2,阅读__weak变量需要保留对象(当然,然后释放):

对对象左值执行左值到右值转换时会发生读取。

  • 对于 __weak 对象,当前指针被保留,然后在当前完整表达式末尾释放。对于分配和指向对象的最终释放,这必须以原子方式执行。
  • 对于所有其他对象,左值加载有原始语义。

它没有说明原因,但想一想如果从 __weak 变量获得的对象在您开始使用它之前就死掉了,会发生什么。弱指针的目的是确保你有nil或具有众所周知生命周期的有效对象,这就是为什么读取其值意味着保留指针对象(然后属性的 getter 返回它自动释放)。

这并不是 Obj-C 独有的,它是所有弱指针实现(引用计数和垃圾收集)的常见习惯用法。弱指针不能直接给出指针值,它们必须创建指向“持有”对象的强指针,以确保它在调用者开始使用它之前不会消失。在Obj-C中,是retain-autorelease;在C++中,weak_ptr首先创建shared_ptr,在垃圾收集环境中,返回强引用并默默地延长对象的生命周期。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Objective-C - 弱属性 - getter autoreleases(自动引用计数) 的相关文章

  • 不使用 MFMailComposeViewController 发送邮件

    我想从 iPhone 应用程序发送邮件而不显示MFMailComposeViewController 我还希望从用户的默认邮件帐户发送此邮件 是否有可能做到这一点 iPhone SDK 不支持这一点 可能是因为 Apple 不希望您这样做
  • iOS - 单元测试异步代码

    我试图测试的方法部分如下 void configureTableFooterView dispatch async dispatch get main queue self tableView tableFooterView nil if
  • 处于编辑模式时滑动即可删除

    我有一个使用 uitableview 的 iPhone 应用程序 我希望始终显示 重新排序 控件 并让用户滑动以删除行 我目前采取的方法是将表格视图置于编辑模式并允许在编辑模式下进行选择 self tableView editing YES
  • UICollectionView 滚动到任何页脚或页眉视图

    我想滚动到集合视图的页脚或标题视图 但是 标准方法是scrollToItemAtIndexPath仅滚动到单元格 void scrollToBottom NSInteger section self numberOfSectionsInCo
  • 如何获取未知大小 NSArray 的前 X 个元素?

    在 ObjectiveC 中我有一个 NSArray 我们称之为NSArray largeArray 我想要一个新的NSArray smallArray仅包含前 x 个对象 或者如果largeArray 的大小已经 这种方法 NSArray
  • 将 NSDecimalNumber 转换为 NSString

    我正在从如下所示的对象中检索密钥 po obj TypeID 3 TypeName Asset 键值的检索方式如下 NSString typeId NSString obj objectForKey TypeID typeId 不是 NSS
  • 动态增加UITableViewCell中UILabel的高度?

    我有一个 UITableView 其中显示一个自定义单元格 我的单元格有两个标签和一个视图 如下图所示 我已经像这样给出了左视图的约束 项目标签限制 中心视图约束 右视图的约束 I am using a bean class to stor
  • UIAlertController 在 iOS 9 中不工作

    I have added the UIAlertController code showing login and password textfields it works for iOS 8 but in iOS 9 not works
  • 如何在iPhone应用程序中的类结构中实现主键和外键表数据[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 如何连接sqlite数据库中的两个表数据 if sqlite3 open dbPath UTF8String database SQL
  • 释放 Core Foundation 对象引用

    我是否需要释放 Core Foundation 对象来清理内存 如果是这样 怎么办 例如 在代码中 ABAddressBookRef addressBook ABAddressBookCreate CFArrayRef peopleArra
  • 当我从我转向的视图控制器返回时,为什么我的 UITableView 的格式完全出错了?

    我有一个UITableView使用自定义单元格 其中有一些标签可以动态决定单元格的高度 当我点击一个单元格并转到一个新的视图控制器时 返回后所有单元格的格式完全混乱 我无法弄清楚是什么导致了它 这是细胞通常的样子 我对它们设置了一些非常基本
  • NSDictionary 上的 NSPredicate

    我试图根据字母表在表格视图中创建部分 并在这些部分下按字母顺序对我的条目进行排序 我已经收集了 bandArrayIndex 中 bandArray 每个条目的第一个字母 现在我尝试使用 NSPredicate 来计算每个字母有多少个 我正
  • 将第 3 方库 ZXing 导入 Xcode

    我尝试了多种方法将第 3 方库 ZXing 导入我的 iOS 应用程序 但所有方法都很痛苦 或者根本不起作用 如果有人可以建议我做错了什么 或者提出导入 ZXing 等库的更好方法 我将非常感激 一定比这个容易 这就是我所做的 结果是 My
  • iPad 照片选择器崩溃

    我正在使用以下函数根据 UIActionSheet 的结果激活设备相机或图像选择器 如果 fromCamera YES 那么它适用于 iPhone 和 iPad 如果 fromCamera NO 那么它可以在 iPhone 上运行并出现图像
  • 在 Objective-C 中比较 2 个字符串

    我写了以下代码 if depSelectedIndice gt 1 comSelectedIndice gt 1 NSLog depart elemet d depSelectedIndice NSLog depart elemet d c
  • Objective-C – 拥有包含 TestFlight SDK 的 TestFlight 配置

    我已按照 TestFlight 的说明复制 发布 配置 我还使用 TestFlight SDK 从我的应用程序获取实时报告 通过这样做 我必须在我的应用程序中包含一些 TestFlight 代码 当然 我不想在我的应用程序的发布版本中包含此
  • 在 Objective C 的类方法中引用类本身

    我希望我没有跳过 ObjC 手册中的这一部分 但是是否可以从类的一个类方法中引用该类 就像在 PHP 中一样 您将使用 this 来引用当前实例 而 self 引用实例的类 this 的 ObjC 等价物将是 self 那么 PHP 的 s
  • 推送动画,没有阴影和停电

    我有一个简单的iOS NavigationController基于应用程序 二UICollectionViews 相继 如果元素打开 第一个合集 被点击时 第二集 将被打开 非常简单 重要的提示 Both UICollectionViews
  • insertNewObjectForEntityForName:

    我使用 Xcode xcdatamodel 文件编辑器设置了一个实体 我创建了一个名为 Person 的实体 添加了一些属性 然后生成了一个 m 文件来表示它 一切都很好 现在 当我去编写一行代码时 例如 Person person Per
  • 在 UIScrollview 上显示缩略图的最佳方法是什么(从服务器下载)

    我想在 UIScrollview 如照片应用程序 上显示许多图像 作为缩略图 所有图像将从服务器下载 据我所知 有几种选择 1 通过创建 UIImageviews 然后将它们添加为主滚动视图上的子视图 2 通过子类化一个UIView类 然后

随机推荐

  • WooCommerce - 将产品描述从选项卡移至摘要中

    我一直在寻找如何将 Woocommerce 单个产品页面上的产品描述从选项卡移至主要部分 我就是到处都找不到它 如果有人能帮助我 我将非常感激 因为我有点失去理智了 谢谢 担 Edit 提交后 我有了一个想法 所有的钩子都只是函数 所以我创
  • python sqlAlchemy:更改类位置后出现 InvalidRequestError

    如果我把CapacityMin类和单元测试类在同一个 py 文件中 一切安好 但我搬家后CapacityMin类到一个单独的文件 并运行单元测试 我得到这个错误 预期的 SQL 表达式 列或映射实体 DETAILS InvalidReque
  • 如果为空则隐藏表格行

    我的 JSP 中有一个表 当生成页面时 该表可以为空 我想知道是否有办法仅在它们中没有实际文本的情况下隐藏它们 这是它们的样子 table border 1 style padding left 4px tr td td tr table
  • 禁用单个(禁用)@Html.EditorFor 上的验证

    我读过 给定的执行方式似乎对于不同的操作 控制器具有不同的视图模型 在我看来 这有点矫枉过正 我想 Html EditorFor model gt model Ingredient Name new htmlAttributes new c
  • 如何将 Carbon AXUIElementRef 转换为 Cocoa NSWindow

    在我的项目中 我可以获得鼠标所在的窗口 并且我可以使用AXUIElementSetAttributeValue element kAXFrontmostAttribute kCFBooleanTrue 使窗口暂时处于顶层 所以我想将元素转换
  • 如何在 PrimeNG 15.4+ 中替换表头排序图标

    在最新版本的 PrimeNG 中 图标排序的方式发生了变化 他们曾经只是有一个i带有 CSS 类的标签 我可以在 CSS 中覆盖它以使用我公司的图标 但现在他们使用带有 SVG 的模板 我在他们的发行说明中看到如何覆盖菜单中的图标 例如下拉
  • git 提交目录

    我创建了一个存储库 并在本地将现有项目目录拖放到该存储库中 然后我做了类似 git add directory 的事情并提交并推送它 当我在 github 上查看我的存储库时 我看到的只是没有子文件夹 没有内容的目录 如何将该项目的所有文件
  • 如何将图库按钮添加到有意打开的相机中?

    在我的应用程序中 用户可以使用相机拍摄照片 我使用意图来启动它 Intent android provider MediaStore ACTION IMAGE CAPTURE 现在 当打开相机时 缺少图库按钮 该按钮允许用户从 SD 卡中选
  • 主导基线在 Firefox 中不起作用

    考虑以下示例 g transform translate 50px 50px dominant baseline central text anchor middle
  • 在 JavaScript 中分析 JSON 数据

    我并不是说这是一个完全聪明的想法 我认为 理想情况下 大量数据的计算应该在后端完成 但请幽默一下 我正在尝试从 JSON 源中提取视图数据并进行一些分析 给定以下数据源 group satellite 1 data label feed 1
  • 以编程方式更改标签属性

    问题是我需要以编程方式更改标签字体粗细和字体样式 但似乎没有任何效果 这是我到目前为止所尝试的 label FontWeight FontWeight FromOpenTypeWeight 99 对于 label FontStyle 我不知
  • 使用 Python 创建 2 人游戏

    我的朋友向我提出挑战 要求我制作一个我们可以互相对战的流行游戏 战舰 的版本 如果你不了解这款游戏 那其实并不重要 因为对我来说 困难的部分不是制作游戏 而是弄清楚我们如何通过计算机相互对战 我之前制作过同样的游戏 只针对一名玩家 我使用的
  • 如何在rails 4中的单个rails应用程序中访问多个数据库?

    我是 Rails 新手 不知道如何在 Rails 单个应用程序中访问多个数据库 我会这样尝试 配置 数据库 yml default default adapter mysql2 encoding utf8 pool 5 username r
  • R:按字母数字对数据框进行排序

    我有一个数据框 它存储每个模型的计数值 型号名称是字母数字 然后 我使用 ggplot2 生成条形图 其中 x 轴为模型 y 轴为计数 我想订购我的 x 轴 x 轴在数据框中和图中的 x 轴中显示如下 我想对其进行正确排序 例如 M 1 M
  • 如何强制将一段文本设置为“direction rtl”段落内的“direction ltr”

    因此 电话号码始终是ltr 从左到右 在多语言网站上工作时 我需要在具有方向 rtl 的文本段落中插入电话号码 带有 前缀和用 分隔的数字 当然对于相关语言 所以我有这样的事情 ltr test direction ltr rtl test
  • cout 和 printf 适用于内置调试而非发布的 Dll

    我构建了一个 DLL 通常通过 SetWindowHookEx 注入到控制台应用程序中 DLL 将信息输出到控制台非常重要 我一直在使用 std cout 执行此操作 DLL 已接近完成 直到我尝试在发布模式下构建 DLL 这使得所有 co
  • 调试 C 代码

    有人可以告诉我我的代码有什么问题以及为什么它会产生这个输出 Code int main unsigned num char response do printf Please enter a positive integer greater
  • 禁用属性的正确值是多少?

    的正确值是多少disabled文本框或文本区域的属性 我以前见过使用以下内容
  • 如何根据环境实现cucumber场景不同的数据

    我在不同环境中执行 cucumber jvm 场景时遇到问题 场景的特征文件中包含的数据属于一个环境 为了在不同的环境中执行场景 我需要根据要执行的环境更新功能文件中的数据 例如 在以下场景中 我将搜索条件包含在功能文件中 搜索条件对于 Q
  • Objective-C - 弱属性 - getter autoreleases(自动引用计数)

    我有疑问weakARC 中的属性 自动引用计数 我的理解 如有错误请指正 weak属性的行为类似于assign属性 但当该属性指向的实例被销毁时 ivar 会指向 nil 问题 我只是觉得吸气剂weak属性保留和自动释放 它不是应该像 ge