如何在Objective-C中实例化一个不从NSObject继承的类

时间:2012-01-21 15:17:16

标签: objective-c class instantiation

鉴于此:

Person.h:

@interface Person 
{
}
- (void) sayHello;
@end

Person.m:

#import "Person.h"

@implementation Person 

- (void)sayHello 
{
    printf("%s", "Steve");
}

@end

你如何实例化这个人?我试过这个:

Person *p = [Person new];

这不起作用,也不是这样:

Person *p = [Person alloc];

[UPDATE]

我忘了告诉,我已经尝试从NSObject继承,新的和alloc工作。我只是好奇我们是否可以实例化一个不从NSObject继承的类?

4 个答案:

答案 0 :(得分:29)

你绝对可以这样做。您的课程只需要实现+alloc本身,NSObject的方式。在基础上,这只是意味着使用malloc()来获取足够大的内存块以适合定义类实例的结构。

引用计数的内存管理也很不错(retain / release);这实际上是NSObject protocol的一部分。您也可以采用该协议并实现这些方法。

作为参考,您可以查看the Object class,它是一个根类似于NSObject的根ObjC类,Apple在其开源存储库中为Objective-C运行时提供:

@implementation Object 

// Snip...

+ alloc
{
    return (*_zoneAlloc)((Class)self, 0, malloc_default_zone()); 
}

// ...

- init
{
    return self;
}

// And so on...

话虽如此,您应该将NSObject视为ObjC运行时的一个组成部分。在好奇心,调查或实验之外实现自己的根类几乎没有任何理由(但是,根本不应该气馁)。

答案 1 :(得分:4)

你必须:

  1. 继承自NSObject,
  2. 用自己的mallocs等做一个“穷人”课程,或者
  3. 使用Objective-C ++并创建一个C ++类。
  4. 当然,其他两个都不适合Objective-C存储管理,它们的呼叫协议等也不同。

答案 2 :(得分:3)

(很可能)没有理由不想继承NSObject,但有很多理由这样做。

我很想知道为什么你不想继承NSObject。我猜它源于缺乏知识而不是真正的需要。

但即使不知道这个理由:不要这样做。很难做到这一点很好,它仍然可以与其他Objective-C类很好地相处,几乎是不可能的。

无论如何,你是以隐藏真实所做的方式实例化你的对象。在Java中,您通常通过默认构造函数方法new创建实例,在Objective-C中通过调用类上的alloc然后在实例上调用init来实例化:

Person *aPerson = [[Person alloc] init];

可能只使用Person new,但我不会这样做,因为它隐藏了你真正做过的事情)

您实现了类,以便从NSObject继承,然后在必要时编写自己的init方法。

如果您想登录控制台,请使用NSLog

NSLog(@"Hello %@", @"Steven");

@""是NSString的特殊构造函数。在Objective-C中的字符串不是字节数组,而是对象。)

答案 3 :(得分:-6)

你不能......

Alloc和new ..copy init 所有这些方法都在 NSObject 中定义..

你不能自己创建,因为苹果不提供NSObject实现类。所以你必须从NSObject或其子类继承,以便你可以初始化你的类