Objective C方便方法使用

时间:2014-02-23 10:17:43

标签: objective-c class methods

我想了解便利方法。

如果我有一个包含商店详细信息的sqlite数据库,并在FMResultSet中返回这些商店详细信息。我想要创建一个这些商店详细信息的数组作为Store对象,最好的方法是在一个方便的方法中创建一个Store类型的对象并添加到数组。

我创建的课程如下所示,方便方法

@interface StoreDetails : NSObject   

@property (nonatomic, strong) NSString *storeName;
etc etc etc

+ (instancetype)storeWithStoreName:(NSString *)storeName 
                   TelephoneNumber:(NSString *) 
                   telephoneNumber: etc .......

我的ResultSet循环如下所示?

NSMutableArray *Stores = [[NSMutableArray alloc] init];
while ([rs next]) {
    Store *store = 
    [Store storeDetailsWithStoreName:[rs stringForColumn:@"storename"] 
                            telephoneNumber:[rs stringForColumn:@"TelephoneNo"]];

    [Stores addObject:store];
}

我的想法是否正确如上所述,最好如下所示。

NSMutableArray *Stores = [[NSMutableArray alloc] init];

while ([rs next]) {
    Store *store = [Store alloc] init];
    store.storeName = [rs stringForColumn:@"storename"];
    store.telephoneNumber = [rs stringForColumn:@"TelephoneNo"];
    [Stores addObject:store];
}

我试图理解的是为什么你会在noob发言中使用一个而不是另一个人。

1 个答案:

答案 0 :(得分:1)

我认为你有一个很好的方法:在Store类的方法中初始化你的Store对象。

您定义的storeDetailsWithStoreName:...方法是Apple称之为 factory method 的一个很好的例子(假设您在其实现中没有做任何奇怪的事情)。这是一种非常常见的模式;基金会有各种各样的例子:arrayWithCapacity:numberWithInt:等等。

使用ARC,这些工厂方法的最简单示例几乎与相应的alloc / init表达式相同,因为开发人员不再需要考虑自动释放对象。但是工厂方法仍然有很多用途,例如:特殊的实例化模式,如singleton或flyweight,包括少量常见的转换或格式化代码,以方便实现class clusters等。而且没有额外的括号和缩进的简单方便。

instancetype关键字是一个不错的选择。这允许您将相同的消息发送到Store的子类,期望该方法将使用相同的init方法实例化子类的对象,如下所示:

+ (instancetype)storeWithStoreName:(NSString *)storeName 
                   telephoneNumber:(NSString *) 
                   ...
{
    return [[self alloc] initWithStoreName:...];
}

在上面的代码中,因为它是一个类方法,self中的[self alloc]是Class对象(Store或Store的子类)而不是Store的特定实例。这允许在运行时创建正确类的实例,具体取决于您是调用[Store storeWithStoreName:...]还是[MoreSpecificStoreSubType storeWithStoreName:...]

工厂方法的替代方法,或者实际上是对它的称赞,是在Store类中声明自定义init方法:

- (id)initWithStoreName:(NSString *)storeName
        telephoneNumber:(NSString *)telephoneNumber ...

...并直接在循环中使用它,而不是工厂方法。再次,使用ARC,两者之间没有太大的区别,除非你想在工厂方法中做额外的工作。您可以拥有init方法的多个变体;标准做法是让所有人调用最详细的init方法,称为designated initializer

我建议花点时间阅读有关课堂设计标准的Apple文档页面(我链接到上面的一些页面)。由于其中很多内容更多地基于约定而非语言设计限制,因此了解优秀设计的模式和最佳实践以及特殊方法的正确行为非常重要。