首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >当我使用作为Singleton属性的NSMutableArray时,向NSMutableArray中添加一些对象。压碎

当我使用作为Singleton属性的NSMutableArray时,向NSMutableArray中添加一些对象。压碎
EN

Stack Overflow用户
提问于 2017-03-13 16:10:34
回答 1查看 181关注 0票数 0

这是我的sampleCode:

代码语言:javascript
运行
复制
-(IBAction)add:(id)sender {
//ShoppingManager sharedManager is a singleton
[[ShoppingManager sharedManager].onlineClassArray addObject:@(1)];
}

和ShoppingManager.m中的代码:

代码语言:javascript
运行
复制
//singleton
+ (ShoppingManager *)sharedManager{
    static id instance;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc]init];
    });
    return instance;
}


- (OnlineClassItemizeArray *)onlineClassArray{
    if (!_onlineClassArray) {
        _onlineClassArray = [OnlineClassItemizeArray array];
    }
    return _onlineClassArray;
}

还有ShoppingMananger.h:

代码语言:javascript
运行
复制
@interface ShoppingManager : NSObject
@property(nonatomic,strong) OnlineClassItemizeArray * onlineClassArray;
+ (ShoppingManager*)sharedManager;
@end

我不知道这些codes.when有什么问题--我在mutableArray中添加了一些对象,它停在了下面一行:(一个完全异常的BreakPoint)

代码语言:javascript
运行
复制
  _onlineClassArray = [OnlineClassItemizeArray array];

比在这里被碾碎更重要:

代码语言:javascript
运行
复制
DISPATCH_INLINE DISPATCH_ALWAYS_INLINE DISPATCH_NONNULL_ALL DISPATCH_NOTHROW
DISPATCH_SWIFT3_UNAVAILABLE("Use lazily initialized globals instead")
void
_dispatch_once(dispatch_once_t *predicate,
        DISPATCH_NOESCAPE dispatch_block_t block)
{
    if (DISPATCH_EXPECT(*predicate, ~0l) != ~0l) {
        dispatch_once(predicate, block);//<---crushed here
    } else {
        dispatch_compiler_barrier();
    }
    DISPATCH_COMPILER_CAN_ASSUME(*predicate == ~0l);
}

下面是整个错误信息:

代码语言:javascript
运行
复制
  2017-03-14 01:01:36.586 tesr1111[7075:1333259] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** -[NSMutableArray initWithCapacity:]: method only defined for abstract class.  Define -[OnlineClassItemizeArray initWithCapacity:]!'
*** First throw call stack:
(
    0   CoreFoundation                      0x00000001100c4d4b __exceptionPreprocess + 171
    1   libobjc.A.dylib                     0x000000010fb2621e objc_exception_throw + 48
    2   CoreFoundation                      0x00000001101357df __CFRequireConcreteImplementation + 255
    3   CoreFoundation                      0x00000001101241a7 -[NSMutableArray initWithCapacity:] + 39
    4   tesr1111                            0x000000010f54e6d0 -[ShoppingManager init] + 160
    5   tesr1111                            0x000000010f54e5f1 __32+[ShoppingManager sharedManager]_block_invoke + 65
    6   libdispatch.dylib                   0x0000000112eda0cd _dispatch_client_callout + 8
    7   libdispatch.dylib                   0x0000000112ebf1f8 dispatch_once_f + 501
    8   tesr1111                            0x000000010f54e588 +[ShoppingManager sharedManager] + 136
    9   tesr1111                            0x000000010f54de9d -[ViewController add:] + 61
    10  UIKit                               0x00000001104ea8bc -[UIApplication sendAction:to:from:forEvent:] + 83
    11  UIKit                               0x0000000110670c38 -[UIControl sendAction:to:forEvent:] + 67
    12  UIKit                               0x0000000110670f51 -[UIControl _sendActionsForEvents:withEvent:] + 444
    13  UIKit                               0x000000011066fe4d -[UIControl touchesEnded:withEvent:] + 668
    14  UIKit                               0x0000000110558545 -[UIWindow _sendTouchesForEvent:] + 2747
    15  UIKit                               0x0000000110559c33 -[UIWindow sendEvent:] + 4011
    16  UIKit                               0x00000001105069ab -[UIApplication sendEvent:] + 371
    17  UIKit                               0x0000000120cca481 -[UIApplicationAccessibility sendEvent:] + 93
    18  UIKit                               0x0000000110cf372d __dispatchPreprocessedEventFromEventQueue + 3248
    19  UIKit                               0x0000000110cec463 __handleEventQueue + 4879
    20  CoreFoundation                      0x0000000110069761 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 17
    21  CoreFoundation                      0x000000011004e98c __CFRunLoopDoSources0 + 556
    22  CoreFoundation                      0x000000011004de76 __CFRunLoopRun + 918
    23  CoreFoundation                      0x000000011004d884 CFRunLoopRunSpecific + 420
    24  GraphicsServices                    0x0000000113eb0a6f GSEventRunModal + 161
    25  UIKit                               0x00000001104e8c68 UIApplicationMain + 159
    26  tesr1111                            0x000000010f54e4df main + 111
    27  libdyld.dylib                       0x0000000112f2668d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException

如果有人能给我任何想法或帮助链接。提前谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-03-13 17:28:30

您对NSMutableArray进行了错误的子类划分。它是一个类集群,需要实现的方法最少。

在本例中,您正在调用initWithCapacity:,但尚未重写该方法。或者,更有可能的是,您正在调用一个泛型方法(init),该方法通过该方法进行调用。

正如例外说的那样:

2017-03-14 01:01:36.586 tesr11117075:1333259终止应用程序由于未命名异常'NSInvalidArgumentException',原因:‘-NSMutableArray initWithCapacity::method仅为抽象类定义。定义-OnlineClassItemizeArray initWithCapacity:!'

但是,子类集合类是一个code smell。它几乎从来没有做过。在少数情况下,这是合理的;你的是什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42768336

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档