2008-12-28 102 views
4

定义如何创建一个类的@implementation的方法,而不在@interface定义它?创建的实现方法没有头

例如,我有一个构造函数,做一些初始化,然后从文件中读取数据。我想将文件读取代码分解为一个单独的方法,然后在构造函数中调用它。我不想在头文件来定义这种方法,因为它是公开的,只有这@implementation上下文。

这可能吗?

这是我的例子。我有一个小程序,它是从文件中读取Todo任务列表的。

这里是@interface:

@interface TDTaskList : NSObject { 
    NSString* name; // The name of this list. 
    NSMutableArray* tasks; // The set of tasks in this list. 
} 

-(id)initListOfName:(NSString*)aName; 
-(NSArray*)loadListWithName:(NSString*)aName; 

@end 

这里是@implementation的一部分:

-(id)initListOfName:(NSString*)aName { 
    if (self = [super init]) { 
    name = aName; 

    NSArray* aTasks = [self loadListWithName:aName]; 
    tasks = [NSMutableArray arrayWithArray:aTasks]; 
    } 

    return self; 
} 

-(NSArray*)loadListWithName:(NSString*)aName { 
    // TODO This is a STUB till i figure out how to read/write from a file ... 

    TDTask* task1 = [[TDTask alloc] initWithLabel:@"Get the Milk."]; 
    TDTask* task2 = [[TDTask alloc] initWithLabel:@"Do some homework."]; 

    return [NSArray arrayWithObjects:task1, task2, nil]; 
} 

我想要做的是已经确定在以下接口:

-(NSArray*)loadListWithName:(NSString*)aName; 

回答

10

如果你把一个方法的实现调用了它,你不需要在标题中定义的任何代码之前。

因此,在这种情况下,把loadListWithName:initListOfName面前:在@implementation块,这将是很好的。

注意:仅仅因为它没有在头文件中定义,并不意味着该方法不能被对象之外的代码调用。 Objective-C没有私有方法。

+1

这是正确的答案。 – mxcl 2009-06-23 16:29:56

2

您可以使用categories

// In TDTaskList.m 
@interface TDTaskList(TDTaskListPrivate) 
-(id)initListOfName:(NSString*)aName; 
-(NSArray*)loadListWithName:(NSString*)aName; 
@end 

@implementation TDTaskList(TDTaskListPrivate) 

// implementation of initListOfName and loadListWithName ... 

@end 
+0

注意,作为目标C 2.0的CA的私人类别不再需要名称名称。这有助于保持代码更简单。 – Andy 2008-12-28 02:15:40

6

安迪在评论中暗示,你可以使用Extensions(这看起来像一个类别没有名字)。所不同的是,你必须实现在扩展声明的方法,而编译器不会验证您实现在一个类别声明的方法。

.H:

@interface MyObject : NSObject 
{ 
    NSNumber *number; 
} 
- (NSNumber *)number; 
@end 

.M:

@interface MyObject() 
- (void)setNumber:(NSNumber *)newNumber; 
@end 

@implementation MyObject 

- (NSNumber *)number 
{ 
    return number; 
} 
- (void)setNumber:(NSNumber *)newNumber 
{ 
    number = newNumber; 
} 
@end 
1

你有两个合理的选择。两者基本上都已经被描述过了,但是恕我直言有些不清楚,甚至是明显的错误。

类别不是其中之一,因为它们是AFAIK意思是将实现分解为多个源文件的完全不同的目的。

  • 做上述弥敦道。虽然他最后的假设(私人方法)是错误的。
  • 使用一个私有方法扩展定义,以允许正向引用如下:

    1. 从头部移除loadListWithName的定义完全
    2. 的@implementation块
    3. 之前添加以下到源(.M)
     
    @interface TDTaskList (PrivateMethods) 
    -(NSArray*)loadListWithName:(NSString*)aName; 
    @end 
    
    @implementation ... 
    

  • 相关问题