ios - 对象初始化风格

标签 ios objective-c

<分区>

假设我的类有以下 ivars/属性:

@property (nonatomic, copy)   NSString *itemName;
@property (nonatomic, copy)   NSString *serialNumber;
@property (nonatomic) int     valueInDollars;
@property  NSDate *dateCreated; 

1) 初始化此类的 ivars 的一种方法是这样的:

// Designated initializer of this class 
-(id) initWithItemName: (NSString*) name
      valueInDollars:(int)value
      serialNumber:(NSString *)sNumber
{

    // Call the superclass's designated initializer
    self = [super init];

    if(self)
    {
        // Init properties
        self.itemName =  name;          
        self.serialNumber = sNumber;      
        self.valueInDollars = value;       
        dateCreated = [[NSDate alloc] init];  
    }

    // Return the address of the newly initialized object
    return self;
}

2)我想初始化这个类的另一种方法是写:

-(id) init
{
 self = [super init];

    if(self)
    {
     // basically do nothing
    }

return self;

}

然后将其留给将要使用该类的用户根据需要进行初始化,例如,

MyClass *object = [[MyClass alloc] init];

object.dateCreated = [[NSDate alloc] init];
[object.dateCreated someMethod];
object.itemName = "Hello";
object.someProperty = [[SomeClass alloc] init];

我认为上面的事情是某些属性(如上所述)必须先调用 alloc/init 才能使用,不是吗?如果用户忘记这样做,那么最多应用程序将无法按预期运行,对吧? (它不会崩溃,因为我们可以向 nil 发送消息)。我在这里写的似乎是这种初始化方式的唯一问题。你怎么看?

附言。此处也允许:http://developer.apple.com/library/ios/#documentation/general/conceptual/CocoaEncyclopedia/Initialization/Initialization.html

页数。假设使用 ARC。

感谢许多回复,但基本上我感兴趣的是解决方案 2 可能存在的问题是什么?

最佳答案

我想您会在 the document that you linked to 中找到答案:

Overriding init is fine for subclasses that require no additional data to initialize their objects. But often initialization depends on external data to set an object to a reasonable initial state.

所以如果你的类不在一个合理的状态,如果变量没有被初始化为一个合适的值,你应该使用

- (id)initWithItemName:(NSString*)name valueInDollars:(int)value serialNumber:(NSString *)sNumber

然后在 init 中,您可以使用默认值调用指定的初始化程序,或者如果没有合理的默认值则不允许使用 init,如 here on SO 所述

关于ios - 对象初始化风格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18097667/

相关文章:

objective-c - 使用类别在 Objective C 类中添加冲突的方法

ios - 如何自动滑动/滑动单元格tableviewcell swift 3

ios - 原生 UIKeyboard 无缘无故被拉伸(stretch)

ios - 调试 iOS 临时崩溃报告 :

mysql - 如何将 sqlite 中每个 session 的所有新值插入到同一行(适用于 iOS)

ios - AFNetworking UIAlertView 在后台且没有网络时

ios - Swift 4 - 从 UICollectionView 单元格推送 ViewController

ios - 如何在 Swift playground 中将 Int 转换为 Double?

iphone - 如何将 UITabBarItem 标题更改为另一个 UITabBarItem 的标题?

ios - @property int 值不能改变,真的很奇怪,我找不到解决办法