Objective c 如何处理无用的init?

Objective c 如何处理无用的init?,objective-c,cocoa-touch,coding-style,object-initializers,Objective C,Cocoa Touch,Coding Style,Object Initializers,这是我目前在init中拥有的 它什么也不做,但我有另一个名为initWithObject的方法:它将使用其参数填充实例变量url、blurb和author。我不知道我该怎么处理这件事。我应该抛出一个异常吗?我还有什么其他选择?您不必使用普通的init,只需使用initWithObject:method即可。如果您正在执行的任何基本设置在80%的时间内保持不变,或者如果您在所有初始值设定项中都有一些通用代码,则可以重写init,但不需要重写 也可以考虑用Objist:Noit:名称更具体,类似于I

这是我目前在init中拥有的


它什么也不做,但我有另一个名为initWithObject的方法:它将使用其参数填充实例变量url、blurb和author。我不知道我该怎么处理这件事。我应该抛出一个异常吗?我还有什么其他选择?

您不必使用普通的init,只需使用initWithObject:method即可。如果您正在执行的任何基本设置在80%的时间内保持不变,或者如果您在所有初始值设定项中都有一些通用代码,则可以重写init,但不需要重写


也可以考虑用Objist:Noit:名称更具体,类似于ITIT.POST:我假设这是一种基于IVARS的博客条目获取器,所以更清楚对象是什么样的。

< P>你不必有一个简单的init,你可以简单地用Objult:方法来实现你的init。如果您正在执行的任何基本设置在80%的时间内保持不变,或者如果您在所有初始值设定项中都有一些通用代码,则可以重写init,但不需要重写


也可以考虑将对象与对象进行更改:名称要更具体,对于类似initWithPost的内容:我假设这是一种基于IVAR的博客条目获取程序,因此更清楚需要什么对象。

如果要覆盖标准-init方法,如果不想使用-init,可以返回nil,或者:

- (instancetype)init
{
    return [self initWithObject:nil];
}
如果要完全停止使用-init,可以将其标记为不可用属性或使用NSAssert:

// .h
// ...

- (instancetype)init UNAVAILABLE_ATTRIBUTE;

// ...

// .m
- (instancetype)init
{
    NSAssert(NO, @"This method should not be used");
    return nil;
}

您可以使用UNAVAILABLE_属性或NSAssert,但如果您使用UNAVAILABLE_属性,您需要某种-init实现,即使它只返回nil。

如果您想覆盖标准-init方法,如果您不想使用-init,您可以返回nil,或者执行以下操作:

- (instancetype)init
{
    return [self initWithObject:nil];
}
如果要完全停止使用-init,可以将其标记为不可用属性或使用NSAssert:

// .h
// ...

- (instancetype)init UNAVAILABLE_ATTRIBUTE;

// ...

// .m
- (instancetype)init
{
    NSAssert(NO, @"This method should not be used");
    return nil;
}

您可以使用UNAVAILABLE_属性或NSAssert,但如果您使用UNAVAILABLE_属性,则需要某种-init实现,即使它只返回nil。

我认为您误解了所读内容。我认为你不会破例。你可以;但是,内存泄漏。如果initWithObject:方法如下所示:

- (id)initWithObject:(id)obj {
     if ((self = [self init])) {
              self.url=[obj url];
              self.blurb=[obj blurb];
              self.author=[obj author];
     }
     return self;
}
你会很好的。如果您的对象是用-init实例化的,并且您使用了一个赋值的变量(假设它是实变量),那么您可能会得到一个异常。因此,在后续方法中,请确保在使用对象之前检查对象是否存在

如果使用-init而不是-initWithObject创建对象,则可能引发异常:

- (void)dealloc {
         [url release];
         [blurb release];
         [author release];
         [super dealloc];
}

我认为你误解了你读到的内容。我认为你不会破例。你可以;但是,内存泄漏。如果initWithObject:方法如下所示:

- (id)initWithObject:(id)obj {
     if ((self = [self init])) {
              self.url=[obj url];
              self.blurb=[obj blurb];
              self.author=[obj author];
     }
     return self;
}
你会很好的。如果您的对象是用-init实例化的,并且您使用了一个赋值的变量(假设它是实变量),那么您可能会得到一个异常。因此,在后续方法中,请确保在使用对象之前检查对象是否存在

如果使用-init而不是-initWithObject创建对象,则可能引发异常:

- (void)dealloc {
         [url release];
         [blurb release];
         [author release];
         [super dealloc];
}

如果您有任何不希望调用且不希望子类支持的方法,则在调试生成中抛出异常是完全合理的。

如果您有任何不希望调用且不希望子类支持的方法,在调试构建中抛出异常是完全合理的。

苹果为Cocoa编程制定的规则是,每个类都必须有一个初始值设定项方法,即。类的每个其他初始值设定项都必须调用该D.I.*D.I.本身必须调用超类的D.I。通常,参数最多的初始值设定项(最完整地指定新对象状态的初始值设定项)是D.I

在您的例子中,使用裸init和initWithObject:,第二个可能是D.I。因此,您将重写init,使用一些默认参数调用initWithObject::

- (id) init {

    return [self initWithObject:[Object objectWithURL:[NSURL URLWithString:@"http://www.apple.com"]
                                                blurb:@""
                                               author:@""]];
}
这将导致一种伪对象,它使用无用数据正确初始化。在ARC之外,一定要注意默认参数的内存管理-您想使用自动删除/无主对象


*有时,initWithCoder也会例外:。

苹果为Cocoa编程制定的规则是,每个类都必须有一个初始化器方法,即。类的每个其他初始值设定项都必须调用该D.I.*D.I.本身必须调用超类的D.I。通常,参数最多的初始值设定项(最完整地指定新对象状态的初始值设定项)是D.I

在您的例子中,对于裸init和initWithObject:,第二个可能是D.I。因此,您将重写init以调用initWith 对象:带有一些默认参数:

- (id) init {

    return [self initWithObject:[Object objectWithURL:[NSURL URLWithString:@"http://www.apple.com"]
                                                blurb:@""
                                               author:@""]];
}
这将导致一种伪对象,它使用无用数据正确初始化。在ARC之外,一定要注意默认参数的内存管理-您想使用自动删除/无主对象


*有时,initWithCoder会出现一个例外:。

我不确定这里什么更安全,返回nil意味着我不会崩溃,但稍后可能会引入一些微妙的逻辑错误。我想对我来说,我宁愿我的程序崩溃,所以我解决了错误,这很可能是程序员错误,没有使用正确的指定初始值设定项或其变体。我不确定这里什么更安全,返回nil将意味着我没有崩溃,但稍后可能会引入一些微妙的逻辑错误。我想对我来说,我宁愿我的程序崩溃,所以我解决了错误,这很可能是程序员错误,没有使用正确的指定初始值设定项或它的一个变体。我使用的是ARC。这对我的问题有影响吗?只有self.url=[[NSURL alloc]init];如果你不是我相信你知道的那样,那就是内存泄漏。我以为你是,只是仔细检查一下。我用的是ARC。这对我的问题有影响吗?只有self.url=[[NSURL alloc]init];如果你不是我相信你知道的那样,那就是内存泄漏。我以为你是,只是仔细检查一下。