我是encountering an issue with my code并且有人解释说这是因为我没有为我的财产创建一个实例,他告诉我应该在我的init方法中这样做。我不明白的是:我已经通过这样做创建了我的对象:
TADIgnoringConstraint *ignorer = [TADIgnoringConstraint new];
我知道我也可以使用[[TADIgnoringConstraint alloc] init],但是我发现init方法已经存在,所以我应该创建一个新的自定义初始化方法吗?在这种情况下,如何创建init函数?这个函数返回什么?
答案 0 :(得分:2)
[TADIgnoringConstraint new]
与
完全相同 [[TADIgnoringConstraint alloc] init]
在内存中分配对象并初始化它。当你在一个已分配的对象上调用init
时,它会在声明时运行该对象的init
方法,否则它会运行超类的init
,它返回它自己的对象。
现在@Wain告诉你的是用init
方法实例化你的数组。在大多数情况下,这是典型的做法。
您可以这样做:
- (id)init
{
self = [super init];
if (self) {
// Set your properties properly here
// before you actually return the object so they can be ready to use
_someMutableArray = [NSMutableArray array];
}
return self;
}
答案 1 :(得分:1)
new
与alloc
相同,后跟init
。在NSObject
中,new
定义为
+ (id)new
{
return [[self alloc] init];
}
答案 2 :(得分:0)
查看另一个线程,假设的问题是您可能没有初始化tockensArray
属性。如果这是真的,那么您需要在init
TADIgnoringConstraint
方法中执行该操作,您已经存在了self.tockensArray = [NSMutableArray array];
。
在这种情况下你需要的是:
tockensArray
如果这不是实际问题,请说明您如何声明init
以及{{1}}中当前的内容。
答案 3 :(得分:0)
TADIgnoringConstraint *ignorer = [TADIgnoringConstraint new];
该行代码创建类TADIgnoringConstraint的新对象,并将指向该对象的指针存储到局部变量中。因为它是一个局部变量而且显然没有存储在其他任何地方,所以只要你离开函数或方法,它就会被删除。
我强烈建议使用[[TADIgnoringConstraint alloc] init],主要是因为每个人都这样做。以下约定意味着您的代码更易于阅读,包括您自己在内的人员无需检查您的问题是否是由于不遵循惯例而导致的。 (你可能会说:“但是新的和alloc + init一样”我会回答“你的代码不能正常工作。你会打赌1000美元它确实是相同的吗?”)。