在我成为Objective C的大师的过程中,我一直在探讨它的细微之处,我想与大家分享并理解为什么
1)我有两个init方法,一个是NSObject为Objective C类继承的方法,另一个是我自己创建的自定义方法,让我们说
initCustomMethod:(int)par1 argument2:(int)par2;
我的目标是通过提供的init方法调用initCustomMethod,基本上是
-(id)init{
return [self initCustomMethod:1 argument2:3];
}
当然,维护顺序,我在.m文件中的initCustomMethod之前出现了init。 Xcode警告我告诉我没有找到initCustomMethod,我继续调整顺序并在initCustomMethod声明后出现init并且没有这样的警告消息,一切都很好。
我同意订单很重要,因为它主要来自C,但我不确定。因为,我改变了一些属性及其自定义方法的顺序,在给定属性的自定义setter方法之后声明了属性@synthesize
,但是没有这样的错误副本。
有人能指出这里的恶意吗?
谢谢你们!
非常酷的家伙,谢谢你帮我解决这个问题。此外,由于我有一个自定义init方法,我正在初始化此方法中的super并使用原始的init方法来调用自定义init方法。
这有什么不对吗?
答案 0 :(得分:5)
在任何地方引用它之前,您应该在界面中声明 initCustomMethod:argument2
,这通常位于您的头文件中。
例如,您通常会有一个.h文件,如下所示:
@interface MyClass
{
//instance variables
int anInstanceVariable;
}
// properties
@property (nonatomic, assign) int aProperty;
// methods
-(id)initCustomMethod:(int)par1 argument2:(int)par2;
@end
如果您这样做,定义 init
和initCustomMethod:argument2:
的顺序无关紧要。这是因为声明告诉编译器你要定义方法,以及它的外观,所以在以后使用时不会混淆。
答案 1 :(得分:2)
在Objective-C中使用函数或方法在声明或定义之前是个坏主意。将initCustomMethod:argument2:
置于init
之前意味着前者已在后者中定义。但如果您只是在标题中声明它,那么它们进入的顺序无关紧要。
答案 2 :(得分:2)
在头文件中添加自定义方法名称 - 编译器只是按顺序进行处理。如果您没有前向声明,编译器将不知道如何处理该调用。如果您希望程序的其他部分能够调用它,则需要将其放在标题中。