在类接口中,我定义了一些变量
@property (strong,nonatomic) id < Protocol > initEst; // Initial estimate
此编译没有问题,但是当我提示initEst
时,出现意外的和看似无关的运行时错误。
发生了什么事?
initXXX
是一个ivar
id
类型的
实现一个Protocol
,它与包含的类的
@interface Dog : NSObject < Animal >
@property (nonatomic,strong) id < Animal > initState;
@end
类似这样的东西会引起问题,只是因为名称以init
开头。更改名称,所有问题都会消失。作为参考,此生成的运行时错误为
已取消分配时已释放的狗对象
此代码段非常抽象,但是这可能会在您需要指定一些初始条件的地方以及您将ivarinitXxx
命名为自然的地方咬住您,但是请注意,如果您使用Objective-C,您将没有那么奢侈或编译器会警告您这是错误的。原始错误似乎与内存分配有关,并且使我怀疑我使用
autoreleasepool的方式,但是现在我相当确信这与问题无关。全部有关ARC自动内存管理的规则。初始化程序对如何处理返回的值有特殊的规则:它将保留并返回。参见https://clang.llvm.org/docs/AutomaticReferenceCounting.html#semantics-of-init。