类的objective-c默认初始化方法?

类的objective-c默认初始化方法?,objective-c,macos,initialization,Objective C,Macos,Initialization,我有两种不同的方法来初始化objective-c类。一个是默认值,另一个是配置参数。现在,我对objective-c非常熟悉,但我已经实现了这些方法,我想知道是否有一种比我更好(更正确/风格更好)的方法来处理初始化。也就是说,我是否按照标准和良好的风格编写了这些初始化函数?检查是否存在selfPtr,然后根据它返回是不对的 下面是我的类头和实现文件。此外,如果你发现任何其他错误或邪恶的东西,请告诉我。我是一名C++/Javascript开发人员,以学习objective-C为嗜好,非常感谢您提供

我有两种不同的方法来初始化objective-c类。一个是默认值,另一个是配置参数。现在,我对objective-c非常熟悉,但我已经实现了这些方法,我想知道是否有一种比我更好(更正确/风格更好)的方法来处理初始化。也就是说,我是否按照标准和良好的风格编写了这些初始化函数?检查是否存在
selfPtr
,然后根据它返回是不对的

下面是我的类头和实现文件。此外,如果你发现任何其他错误或邪恶的东西,请告诉我。我是一名C++/Javascript开发人员,以学习objective-C为嗜好,非常感谢您提供的任何提示

#import <Cocoa/Cocoa.h>

// class for raising events and parsing returned directives

@interface awesome : NSObject {
 // silence is golden. Actually properties are golden. Hence this emptiness.
}

// properties
@property (retain) SBJsonParser* parser;
@property (retain) NSString* eventDomain;
@property (retain) NSString* appid

// constructors
-(id) init;
-(id) initWithAppId:(id) input;

// destructor
-(void) dealloc;


@end

谢谢

老实说,我认为这是一个没有实际意义的观点。当接收到nil参数时,您的第二个初始化方法没有意义(另外,如果输入为nil,您的条件检查中存在逻辑问题)。在这种情况下,我要做的是提供一个初始化方法和两个工厂类方法,它们以通常的方式工作:返回自动释放的实例,在其中一个实例中,提供默认值

例如,声明一个类方法:

+ (awesome*)awesome;
+ (awesome*)awesomeWithAppId:(id)foo;
例如,在
+awesome
的实现中,这样编写:

+ (awesome*)awesome
{
    return [[[awesome alloc] initWithAppId:@"a369x123"] autorelease];
}
+ (awesome*)awesomeWithAppId:(id)foo
{
    return [[[awesome alloc] initWithAppId:foo] autorelease];
}
同样,在您的
awesomeWithAppId:
中,类似这样的内容:

+ (awesome*)awesome
{
    return [[[awesome alloc] initWithAppId:@"a369x123"] autorelease];
}
+ (awesome*)awesomeWithAppId:(id)foo
{
    return [[[awesome alloc] initWithAppId:foo] autorelease];
}

再说一遍,这可能就是我。

默认值将是您选择调用的任何一个

[awesome alloc] init];
[awesome alloc] initWithAppId:ID];

当一个初始值设定项使用一些默认参数简单地执行更复杂的初始值设定项时,将其称为:

-(id)init {
  return [self initWithAppID:nil];
}

-(id)initWithAppID:(id)input {
  if (self = [super init]) {
    /* perform your post-initialization logic here */
  }
  return self;
}

通常,您尝试将其中一个初始值设定项设置为“指定的初始值设定项”,这意味着它总是被调用。在这种情况下,您的init方法应该调用首选的初始值设定项initWithAppID:,而不是超级实现。然后initWithAppId调用超级实现,正如它所做的那样。另外,在initWithAppId:中,您有if(input=nil),它将始终将input设置为nil,并将求值设置为YES。以下是正确的实现

- (id)init {
    return [self initWithAppId:nil];
}
- (id)initWithAppId:(id)input {
    if((self = [super init])) {
        if(input == nil) input = @"a369x123";
        self.appid = input;
        self.eventDomain = @"desktop";
    }
    return self;
}

我看到的一个特殊问题是,如果使用
init
,则调用
[super init]
两次。您还泄漏了
eventDomain
属性,因为您创建了一个拥有权计数为+1的对象,并将其交给一个将拥有权计数增加到+2的方法,您的dealloc方法只会使其返回+1。相对于您的
awesome
对象,它应该是0。此外,
Cocoa/Cocoa.h
include用于Mac OS X,而不是iOS。此外,Cocoa传统上使用大写驼峰大小写(或大写驼峰大小写)作为类名,例如
awesome
morewesome
TheMostAwesome
等。等等,谁添加了
ios
标签?这个问题中没有任何东西表明这是
ios
,事实上正如@jer所指出的,包含的标题表明这是macosx,而不是ios。