鉴于此:
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继承的类?
答案 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)
你必须:
当然,其他两个都不适合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或其子类继承,以便你可以初始化你的类