我经常觉得需要将 Objective-C 代码拆分成多个文件以获得更好的可读性。我想避免创建类并调用它们,而是希望使用简单的导入(就像在 php 中一样)。
如果有人可以提供一个有效的示例,请告知。
我经常觉得需要将 Objective-C 代码拆分成多个文件以获得更好的可读性。我想避免创建类并调用它们,而是希望使用简单的导入(就像在 php 中一样)。
如果有人可以提供一个有效的示例,请告知。
我认为在这种情况下你正在查看类别:
你只需要创建一个新的 .h .m 文件对,在 .h 文件中:
#import MyClass.h
@interface MyClass(Networking)
//method declarations here
@end
并且在.m文件中:
#import MyClass+Networking.h
@implementation MyClass(Networking)
//method definitions here
@end
在 MyClass.m 文件中,导入 #import MyClass+Networking.h 即可完成设置。这样您就可以扩展您的类。
更糟糕的方法是使用C预处理器的#include
指令将多个文件粘贴在一起。您可以从实现文件中取出一些方法并将它们放入新的“片段”文件中,然后在实现文件中#include
该片段文件。这样做会使您的源代码更难理解。我不建议这样做,但这里还是有一个例子:
#import "MyObject.h"
@implementation MyObject
- (void)aMethod { ... }
#include "MyObject-moreMethods.m"
@end
// Note: do not include this target in the “Compile Sources” build phase of your target.
// And **NO** @implementation statement here!
- (void)methodTwo { ... }
- (void)methodThree { ... }
#import <UIKit/UIKit.h>
@interface MyViewController : UIViewController
@property (retain, nonatomic) IBOutlet UITableView *myTable;
@property (retain, nonatomic) IBOutlet UITextField *myTextField;
@end
文件(父级)MyViewController.m:
#import "MyViewController.h"
#define VIEW_CONTROLLER_MAIN_BODY 1
@interface MyViewController ()
@end
@implementation MyViewController
#include "MyViewController_TableMethods.m"
#include "MyViewController_TextFieldMethods.m"
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
}
- (void)didReceiveMemoryWarning
{
[super didReceiveMemoryWarning];
// Dispose of any resources that can be recreated.
}
- (void)dealloc {
[_myTable release];
[_myTextField release];
[super dealloc];
}
文件(子文件)MyViewController_TableMethods.m:
#import <UIKit/UIKit.h>
#import "MyViewController.h"
#ifndef VIEW_CONTROLLER_MAIN_BODY
@implementation ViewController
#endif
#pragma mark -
#pragma mark Table View Common Methods
- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section;
{
return 5;
}
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath;
{
static NSString *myIdentifier = @"myCellIdentifier";
static UITableViewCellStyle myStyle = UITableViewCellStyleSubtitle;
UITableViewCell *cell = [self.myTable dequeueReusableCellWithIdentifier:myIdentifier];
if (cell == nil)
{
cell = [[[UITableViewCell alloc] initWithStyle:myStyle reuseIdentifier:myIdentifier] autorelease];
}
cell.textLabel.text = @"Title";
cell.detailTextLabel.text = @"Details";
cell.accessoryType = UITableViewCellAccessoryNone;
return cell;
}
#ifndef VIEW_CONTROLLER_MAIN_BODY
@end
#endif
文件(子文件)MyViewController_TextFieldMethods.m:
#import <UIKit/UIKit.h>
#import "MyViewController.h"
#ifndef VIEW_CONTROLLER_MAIN_BODY
@implementation MyViewController
#endif
- (BOOL)textFieldShouldBeginEditing:(UITextField *)textField
{
self.myTextField.text = @"Woo hoo!";
return YES;
}
#ifndef VIEW_CONTROLLER_MAIN_BODY
@end
#endif
这表明你的类可能过于庞大。
一种解决方法:使用分类。声明通常可以保留在头文件中。然后,您的实现可以被分成不同的分类。只需确保指定您正在实现的分类,以便编译器可以将其与其声明匹配,并在缺少定义时通知您。
一个将大类分解的好方法是将功能分组到类别中(就像Apple在UIViewController中所做的那样)。对于一个大类,我通常将与其各自功能相关的方法和属性分组,然后在基本头文件中进行拆分。
@interface SomeClass : NSObject
@property (strong, nonatomic) BaseProperty *sp;
- (void)someMethodForBase;
@end
@interface SomeClass (FunctionalityOne)
@property (strong, nonatomic) FuncOne *fpOne;
- (void)someMethodForFunctionalityOne;
@end
@interface SomeClass (FunctionalityTwo)
@property (strong, nonatomic) FuncTwo *fpTwo;
- (void)someMethodForFunctionalityTwo;
@end
由于在分类中无法添加属性(无法添加新的iVar和属性不合成在分类中),因此您需要在基本扩展的实现中重新声明它。
@interface SomeClass()
@property (strong, nonatomic) FuncOne *fpOne;
@property (strong, nonatomic) FuncTwo *fpTwo;
@end
@implementation SomeClass
//base class implementation
- (void)someMethodForBase {
}
@end
@implementation SomeClass (FunctionalityOne)
@dynamic fpOne;
//Functionality one implementation
- (void)someMethodForFunctionalityOne {
}
@end
@implementation SomeClass (FunctionalityTwo)
@dynamic fpTwo;
//Functionality two implementation
- (void)someMethodForFunctionalityTwo {
}
@end
在iOS中最好使用分类来保持代码的整洁。
我知道这是一个老的线程,Objective C 的神灵们可能不会喜欢这个解决方案,但如果你需要拆分文件,请创建一个新的 .m 文件并将你的代码粘贴到那里。然后,在你想要包含它的 .m 文件中的 @implementation 后面加入 #include "yournewfile.m"。避免编译器错误的诀窍是进入 Build Phase 并从 Compile Sources 中删除 "yournewfile.m"。