autorelease 相关问题

使用自动释放来解决与延迟释放存储在对象中的变量有关的问题,直到将来的某个时间以便于引用它,同时避免内存泄漏

Objective-C init quirks

在类接口中,我定义了一些ivar @property(strong,nonatomic)id initEst; //初始估计这可以毫无问题地进行编译,但是当我向initEst发出消息时,我得到了意外的结果。 我已经对此进行了更多测试,并且似乎有[[3个条件可以使这个特殊问题出现。 在我的特殊情况下,ivar的Protocol也与包含类的相同。这似乎是此问题浮出水面的一项附加要求(此处指的是我之前未提及此问题的答案)。 因此,请详细说明我先前的答案。如果 initXXX是一个ivar id类型的 实现一个Protocol,它与包含的类的 same相同 然后,Objective-C + ARC编译器将愉快地编译代码,但无法执行它。 这里是我用来测试的代码示例 @interface Dog : NSObject < Animal > @property (nonatomic,strong) id < Animal > initState; @end 类似这样的东西会引起问题,只是因为名称以 init 开头。更改名称,所有问题都会消失。 作为参考,此生成的运行时错误为 已取消分配时已释放的狗对象 此代码段非常抽象,但是这可能会在您需要指定一些初始条件的地方以及您将ivar initXxx命名为自然的地方咬住您,但是请注意,如果您使用Objective-C,您将没有那么奢侈或编译器会警告您这是错误的。 原始错误似乎与内存分配有关,并且使我怀疑我使用 autoreleasepool 的方式,但是现在我相当确信这与问题无关。 全部有关ARC自动内存管理的规则。初始化程序对如何处理返回的值有特殊的规则:它将保留并返回。参见https://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics-of-init。 一般而言,Objective-C,尤其是ARC,对于方法名称的含义有一些非常严格的规则。 initXXX的意思是“这是一个初始化程序”。如果这不是初始化程序,请不要使用init前缀。 您可以完全关闭ARC并自行管理内存,但是遵守约定会更容易,并且在与其他语言(例如Swift)进行交互的情况下更适合。

回答 2 投票 0

Objective-C初始化和自动释放池怪癖

在类接口中,我定义了一些属性@property(strong,nonatomic)id initEst; //初始估计,然后再在类消息中执行... @autoreleasepool {...

回答 2 投票 0

您如何看待Objective-C中的代码,它在每次迭代中迭代保留计数和调用释放?

我仍然试图理解我在一个项目中发现的这段代码,我正在研究那个创建它的人离开公司之前我可以问的问题。这是代码: - (void)releaseMySelf {...

回答 4 投票 8

为什么SDWebImage在decodeImageWithImage方法中使用@autoreleasepool块?

看起来像下面的代码片段,它在此方法中使用@autoreleasepool块。 +(UIImage *)decodingImageWithImage:(UIImage *)image {//在下载大量图像时// ...

回答 1 投票 0

© www.soinside.com 2019 - 2024. All rights reserved.