Iam在Objective-C学习曲线的第一阶段,所以请耐心等待:)。
我也在阅读Apple文档并在那里做练习。我遇到了特定对象初始化的问题,因为我在Xcode中出现意外(在我看来)行为。
重点(让我们简单一点):
第1步:
我已经从名为XYZPerson的自定义类声明了简单变量。它看起来像这样:
XYZPerson *randomPerson;
"如果"检查退回的初始化对象"未初始化" (如预期的那样)。
if(randomPerson == nil) {
NSLog(@"Random person is not initialized");
} else {
NSLog(@"Random person is initialized");
}
第2步:
我已经使用" alloc"为这个对象分配了内存。关于这个变量的话。据我所知,在这个阶段,这个变量的内存被分配了。它还返回指针?
代码行如下所示:
XYZPerson *randomPerson = [XYZPerson alloc];
检查" nil"让我感到惊讶:(它执行"否则"声明)。
if(randomPerson == nil) {
NSLog(@"Random person is not initialized");
} else {
NSLog(@"Random person is initialized");
}
我也可以向这个对象发送消息并且执行得很好,而不需要调用" init"方法。
这怎么可能?我错过了什么吗?如何" randomPerson"变量在调用" init"之前被初始化。这个实例的方法?为什么" init"那么首先呢?
此外,此处接受的答案Difference between ! and nil check on Objective-C object表示在alloc方法中将ALL对象设置为nil!
Iam来自Java,有一种使用" new"来声明对象的方法。关键词。不使用" new"对象的实例总是" null",并且该实例上的调用方法将导致" NULLPOINTEREXPECTION错误"。
P.S Is" nil"在目标C中,与" NULL"相同在Java?
整个项目如下所示:
主要方法:
XYZPerson *randomPerson = [XYZPerson alloc];
if(randomPerson == nil) {
NSLog(@"Random person is not initialized");
} else {
NSLog(@"Random person is initialized");
}
**XYZ Person Class:**
#import "XYZPerson.h"
@implementation XYZPerson
-(void)sayHello {
//[self saySomething];
}
-(void)saySomething:(NSString *) greeting {
NSLog(@"%@", greeting);
}
@end
答案 0 :(得分:1)
我发布了评论中链接的答案,原因有两个:
一个。你的Q略有不同。
B中。我没有详细确认链接的答案。
首先是您的其他问题:是的,nil
是Objectice-C的NULL
。但是存在一些差异:
一个。在大多数情况下(使用ARC),使用nil
初始化对指针(而不是对象本身)的引用。
XYZPerson *person; // Usually automatically set to nil.
B中。在Objective-C中允许向nil
发送消息,不会抛出异常并返回NO
,0
,0.0
,nil
或任何表示形式of null resp。零(如果它没有像整数那样的空表示)是针对该类型的。有时这是故意做的,你可以依靠它。
你的两个主要问题:
使用+alloc
创建实例对象后,所有实例变量(ivars)都设置为NO
,0
,0.0
,nil
或其他任何null resp的表示。零是该类型。您不应该明确地将此类ivars设置为该值。
例如,如果类XYZPerson
的实例具有名为NSString*
的名称的ivar,则ivar将为nil
。所以,有人可能认为裸-init
没有任何意义,因为它不带参数,因此不做任何事情。但你根本就不知道:在-init
中可能还有其他事情要做。而且,对于Java开发人员来说,这可能是一个惊喜,-init
返回一个对象引用,因此您无法知道-init
是否替换了实例对象,例如双色调。因此,即使您没有看到任何含义,实例对象的第一条消息必须是init
。 (是的,在许多情况下,你不会看到任何差异,但你不知道,是否存在或将来会存在。它是API合同的一部分,所以就这样做。)
在某一方面不同意相关联的答案:
发送+new…
代替+alloc
-init
是更好的方法。
一个。如果您使用简单的+new
,则在许多情况下发送+alloc
-init
是正确的。因此,显然这并不比发送+alloc
-init
更好或更差。这就是它的作用。您始终需要查看文档,是否允许使用+new
或+alloc
-init
进行裸露初始化。但在这种情况下,您可能不想进行裸露初始化,因为它没有意义。
B中。有时候,类的实现者更容易收到类对象的new
消息。