使用Objective-C初始化对象,需要澄清

Jam*_*sev 0 objective-c

如果文件声明

@interface SomeClass: NSObject {
  Data* d;
}

@property (nonatomic, retain) Data* d;
Run Code Online (Sandbox Code Playgroud)

为什么实现文件中的以下行给我一个警告(并且init方法不会被调用?)

[[[self d] alloc] init];
Run Code Online (Sandbox Code Playgroud)

我得到的警告是

未找到实例方法'-alloc'(返回类型默认为'id')

同时,Data- (id) init方法,没有被召唤.

请帮我理解原因.

Rud*_*uis 5

alloc应该在上调用,而不是在实例上调用.

interface SomeClass : NSObject
{
    Data *d;
}
Run Code Online (Sandbox Code Playgroud)

在SomeClass上声明一个init方法,使其看起来像:

- (id) init
{
    self = [super init]; 
    if (self)
    {
        d = [[Data alloc] init];
    }

    return self;
}

- (void) dealloc
{
    [d release];
    [super dealloc];
}  
Run Code Online (Sandbox Code Playgroud)

你现在做:

SomeClass *c = [[SomeClass init] alloc];
Run Code Online (Sandbox Code Playgroud)

你可以使用这门课.请注意,您应该阅读有关类和对象以及内存管理的更多内容(当您应该释放c等时).

如果您有可能使用ARC(自动参考计数),您将无需处理释放物品.但这并不是Xcode 4.1所带来的,只有4.2才能公开访问.