实例变量初始化而不使用" init"方法?

时间:2015-01-09 10:19:04

标签: objective-c

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

1 个答案:

答案 0 :(得分:1)

我发布了评论中链接的答案,原因有两个:

一个。你的Q略有不同。

B中。我没有详细确认链接的答案。

首先是您的其他问题:是的,nil是Objectice-C的NULL。但是存在一些差异:

一个。在大多数情况下(使用ARC),使用nil初始化对指针(而不是对象本身)的引用。

XYZPerson *person; // Usually automatically set to nil.

B中。在Objective-C中允许向nil发送消息,不会抛出异常并返回NO00.0nil或任何表示形式of null resp。零(如果它没有像整数那样的空表示)是针对该类型的。有时这是故意做的,你可以依靠它。

你的两个主要问题:

使用+alloc创建实例对象后,所有实例变量(ivars)都设置为NO00.0nil或其他任何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消息。