封装导致崩溃

时间:2016-11-13 22:18:02

标签: ios objective-c encapsulation

我正在尝试将封装合并到我的应用中(有关此代码应该执行的操作的解释,请参阅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)  {

我在第二行代码中收到以下错误:

enter image description here

由于我是一个使用封装的菜鸟,我不知道我做错了什么。我跟随了几个类似于我的代码的例子;我做错了什么导致这次崩溃?

2 个答案:

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

无需设置其他属性。

你应该在这里做更多的事情(比如使用booksellerIDbooksArray),但这会让你开始。

答案 1 :(得分:0)

您的构造函数需要调用super init才能正确初始化。然后添加初始化代码,最后返回self;

  (id) initWithCategory: (NSString*) booksellerID
  {
      self = [super init];
      if (self != nil)
      {
          myBookSellerID = booksellerID;
      }
      return self;
  }