2016-11-13 86 views
-1

我试图将封装到应用中(关于这是什么代码是应该做的,看到here的解释)......这是类“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) { 

我得到上的代码的第2行以下错误指示:

enter image description here

由于我是使用封装的noob,我没有看到我做错了什么。我跟随了几个与我的代码类似的例子;我做错了什么导致这次崩溃?

+0

[NSMutableDictionary dictionary]不分配新的字典。尝试] [NSMutableDictionary alloc] initWithCapacity:10];例如。 –

+0

这样做([[NSMutableDictionary alloc] initWithCapacity:10];),同样的错误... – SpokaneDude

+0

哦,对不起,你的init必须先调用超级init,构造函数必须返回self。 –

回答

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),但这会让你开始。

+0

嗨里克...再次感谢...我总是感谢您的帮助和明确的解释! 如果你不介意,我会给约翰点分数,因为他很接近,即使是第一个评论是错误的,并且你有很多点(不是你不能使用更多!):D) ,但我认为在这种情况下这是公平的事情。如果您不同意,请在将John标记为答案之前发表评论。 – SpokaneDude

+1

当然。你投票给你认为有帮助的答案。它甚至不必为你自己的问题。如果您在搜索时碰巧找到有用的答案,那就投票吧。 – rmaddy

0

您的构造函数需要调用超级初始化才能正确初始化。然后你添加初始化代码并最终返回自己;

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