Objective c 如何处理无用的init?
这是我目前在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
它什么也不做,但我有另一个名为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];如果你不是我相信你知道的那样,那就是内存泄漏。我以为你是,只是仔细检查一下。