我正在尝试将封装合并到我的应用中(有关此代码应该执行的操作的解释,请参阅here)...这是Class' A'中的代码:
.h文件
@interface ExportBookData : NSObject {
@public NSArray *booksArray;
@public NSMutableDictionary *builtFileList;
@public NSMutableArray *exportData;
}
- (id)initWithCategory: (NSString*) booksellerID;
@end
这是.m文件的代码:
.m文件
@implementation ExportBookData
-(id)initWithCategory: (NSString*) booksellerID {
return (id)booksellerID;
}
@end
这是课程' B'中方法的开始。 (.m文件)使用封装数据:
ExportBookData *abe = [[ExportBookData alloc] initWithCategory:@"ABE"];
abe->builtFileList = [NSMutableDictionary dictionary]; <- crash on this line
abe->exportData = [NSMutableArray arrayWithCapacity:abe->booksArray.count];
if(cbvABE.checked) {
我在第二行代码中收到以下错误:
由于我是一个使用封装的菜鸟,我不知道我做错了什么。我跟随了几个类似于我的代码的例子;我做错了什么导致这次崩溃?
答案 0 :(得分:3)
这里有很多问题。
首先,不要声明公共实例变量。使用属性,仅适用于您希望其他类可以访问的值。
@interface ExportBookData : NSObject
@property(nonatomic, strong) NSArray *booksArray;
@property(nonatomic, strong) NSMutableDictionary *builtFileList;
@property(nonatomic, strong) NSMutableArray *exportData;
- (id)initWithCategory: (NSString*) booksellerID;
@end
现在是您的ExportBooksData init
方法。
需要:
-(id)initWithCategory: (NSString*) booksellerID {
self = [super init];
if (self) {
// do something with booksellerID
}
return self;
}
基类的每个init
方法都应遵循这种一般模式。
现在你的其他代码不必要地使用->
运算符。请改用界面提供的实际属性:
ExportBookData *abe = [[ExportBookData alloc] initWithCategory:@"ABE"];
abe.builtFileList = [NSMutableDictionary dictionary];
abe.exportData = [NSMutableArray arrayWithCapacity:booksArray.count];
但是外部代码正在做所有这些都没有意义。让你的班级根据需要自我设定。所以现在你的init
方法应该是:
-(id)initWithCategory: (NSString*) booksellerID {
self = [super init];
if (self) {
self.builtFileList = [NSMutableDictionary dictionary];
self.exportData = [NSMutableArray arrayWithCapacity:booksArray.count];
// do something with booksellerID
}
return self;
}
现在你的其他代码变成了:
ExportBookData *abe = [[ExportBookData alloc] initWithCategory:@"ABE"];
无需设置其他属性。
你应该在这里做更多的事情(比如使用booksellerID
和booksArray
),但这会让你开始。
答案 1 :(得分:0)
您的构造函数需要调用super init才能正确初始化。然后添加初始化代码,最后返回self;
(id) initWithCategory: (NSString*) booksellerID
{
self = [super init];
if (self != nil)
{
myBookSellerID = booksellerID;
}
return self;
}