封装导致崩溃
Encapsulation causing crash
我正在尝试将封装合并到我的应用程序中(有关此代码应该做什么的解释,请参阅 )...这是 Class [=31 中的代码=]:
.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
这是class'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) {
我在第 2 行代码中收到以下错误:
由于我是使用封装的菜鸟,所以我看不出我做错了什么。我遵循了几个与我的代码相似的示例;我做错了什么导致了这次崩溃?
您的构造函数需要调用 super init 才能正确初始化。然后你添加初始化代码,最后 return self;
(id) initWithCategory: (NSString*) booksellerID
{
self = [super init];
if (self != nil)
{
myBookSellerID = booksellerID;
}
return self;
}
这里有很多问题。
首先,不要声明 public 实例变量。使用属性,并且仅用于您希望其他 class 能够访问的值。
@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;
}
基础 class 的每个 init
方法都应遵循此一般模式。
现在您的其他代码不必要地使用 ->
运算符。改为使用接口提供的实际属性:
ExportBookData *abe = [[ExportBookData alloc] initWithCategory:@"ABE"];
abe.builtFileList = [NSMutableDictionary dictionary];
abe.exportData = [NSMutableArray arrayWithCapacity:booksArray.count];
但是外部代码做所有这些是没有意义的。让您的 class 根据需要自行设置。所以现在你的 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
)但这会让你开始。
我正在尝试将封装合并到我的应用程序中(有关此代码应该做什么的解释,请参阅
.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
这是class'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) {
我在第 2 行代码中收到以下错误:
由于我是使用封装的菜鸟,所以我看不出我做错了什么。我遵循了几个与我的代码相似的示例;我做错了什么导致了这次崩溃?
您的构造函数需要调用 super init 才能正确初始化。然后你添加初始化代码,最后 return self;
(id) initWithCategory: (NSString*) booksellerID
{
self = [super init];
if (self != nil)
{
myBookSellerID = booksellerID;
}
return self;
}
这里有很多问题。
首先,不要声明 public 实例变量。使用属性,并且仅用于您希望其他 class 能够访问的值。
@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;
}
基础 class 的每个 init
方法都应遵循此一般模式。
现在您的其他代码不必要地使用 ->
运算符。改为使用接口提供的实际属性:
ExportBookData *abe = [[ExportBookData alloc] initWithCategory:@"ABE"];
abe.builtFileList = [NSMutableDictionary dictionary];
abe.exportData = [NSMutableArray arrayWithCapacity:booksArray.count];
但是外部代码做所有这些是没有意义的。让您的 class 根据需要自行设置。所以现在你的 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
)但这会让你开始。