封装导致崩溃

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"];

无需设置其他属性。

这里还有很多你应该做的事情(比如使用 booksellerIDbooksArray)但这会让你开始。