Objective-C init quirks

问题描述 投票:0回答:2

在类接口中,我定义了一些变量

@property (strong,nonatomic) id < Protocol > initEst;   // Initial estimate

此编译没有问题,但是当我提示initEst时,出现意外的和看似无关的运行时错误。

发生了什么事?

objective-c automatic-ref-counting initializer autorelease
2个回答
1
投票
因此,请详细说明我先前的答案。如果

initXXX是一个ivar

id类型的

实现一个Protocol,它与包含的类的

    same相同
  1. 然后,Objective-C + ARC编译器将愉快地编译代码,但无法执行它。
  2. 这里是我用来测试的代码示例
  • @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


  • 0
    投票
    © www.soinside.com 2019 - 2024. All rights reserved.