【问题标题】:Why my Objective-C object doesn't want to be instantiated?为什么我的 Objective-C 对象不想被实例化?
【发布时间】:2010-01-13 13:31:05
【问题描述】:

一个多星期以来我遇到了一个问题(在 Objective-C/iPhone 开发中),所以如果有人能帮助我,我将不胜感激。

当我从我编写的类中实例化一个对象时,它返回我 nil,但是当我启动调试模式时,我实际上在 init 方法中看到 self 的属性是正确的已初始化,似乎没有执行 return self 指令。

编辑:

感谢您的回答这是初始化代码

-(id)initWithDate:(NSString *)aDate
             type:(NSString *)aType
           amount:(NSString *)anAmount
         currency:(NSString *)aCurrency
     merchantName:(NSString *)aMerchant
           status:(NSString *)aStatus
{
    if (!(self = [super init])) return nil;
    self->date=aDate;
    self->type=aType;
    self->amount=anAmount;
    self->currency=aCurrency;
    self->merchantName=aMerchant;
    self->status=aStatus;
    return self;
}

【问题讨论】:

  • 请发布您的 init 方法的代码。
  • 感谢您的回答这是初始化代码 -(id)initWithDate:(NSString *)aDate type:(NSString *)aType amount:(NSString *)anAmount currency:(NSString *)aCurrency MercerName :(NSString *)aMerchant status:(NSString *)aStatus { if (!(self = [super init])) return nil;自我->日期=日期;自我->类型=aType;自我->金额=金额;自我->货币=aCurrency; self->merchantName=aMerchant;自我->状态=a状态;回归自我; }
  • 请发布您用来检查返回对象是否为 nil 的代码(我怀疑您说错了 当我从一个类中实例化一个对象时写,它返回我 nil 或者你使用 alloc/init 不正确 - 因为你发布的代码看起来不错)

标签: iphone objective-c initialization


【解决方案1】:

不要使用self->instanceVariable

只需使用instanceVariable

【讨论】:

    【解决方案2】:

    我会把你的代码放在下面

        if (self = [super init]) {
            // Custom initialization
        }
        return self;
    

    而不是 if (!(self... return nil 你已经使用过。但这只是一种习惯。

    我也会避免使用 C++ 风格的“->”赋值,而是使用 self.currency=aCurrency; (或 [self setCurrency:aCurrency]; 更接近我猜的 c++ 调用)假设这些被声明为 @property 或具有 getter 和 setter。

    我相信其中之一会让你继续前进!

    【讨论】:

    • self.currency 仅在 currency 已被声明为 @property 时才有效(或者如果他有 setCurrency 方法)。
    • 实际上,使用if (!(self = [super init])) return nil; 摆脱了我个人鄙视的整个方法长的if 指令。我也用这个方法:)
    • 我认为 c++ -> 是一个方法调用者并且需要同样的东西。我的错。
    • 现在我已经考虑过了,我同意亚当。
    • 另外,Wil Shipley 的初始化形式值得一读:wilshipley.com/blog/2005/07/self-stupid-init.html
    【解决方案3】:

    你应该写

    self.date = aDate;
    // etc.... 
    

    如果date 等在@interface 中声明为@property,或者如果它只是一个类实例变量,则使用

    date = aDate;
    // etc...
    

    此外,如果字符串未使用 retaincopy 修饰符声明为 @property,则您需要手动 retain 它们:

    date = [aDate retain];
    

    【讨论】:

    • 谢谢。但我不认为这是真正的问题,即使每个属性都是一个属性。实际上,出于性能原因,我只是用 -> 编写它以避免触发属性机制。可能我完全错了,因为我在 Objective-C 中只呆了一个月...... :)
    • “为了性能原因而避免触发属性机制” - 试图过早地优化某些东西是人们为提高性能而犯的最糟糕可能的错误之一......使用属性(使用他们的retain/copy/assign 类型)可以更轻松地在 Objective-C 中正确管理内存 - 我强烈建议您使用它,并且只有在确定真正的瓶颈所在之后才优化性能.
    • 只需使用 date=aDate 以避免触发设置器。但是,一不小心就会开始漏水。
    猜你喜欢
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-13
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-04-07
    相关资源
    最近更新 更多