SIGABRT при добавлении объектов в NSMutableArray

#objective-c #cocoa #nsmutablearray

#objective-c #какао #nsmutablearray

Вопрос:

У меня есть метод, который возвращает NSArray значение с точками для построения графика. Ниже приведен код для моего метода.

 - (NSArray *)pointsToPlot:(GraphView *)requester
{
    NSMutableArray *points = [[NSSet alloc] init];

    CGPoint midPoint;
    midPoint.x = self.graph.bounds.origin.x   self.graph.bounds.size.width / 2;
    midPoint.y = self.graph.bounds.origin.y   self.graph.bounds.size.height / 2;

    //Find points to plot
    NSValue *point1 = [NSValue valueWithCGPoint:CGPointMake(midPoint.x - 10, midPoint.y)];
    NSValue *point2 = [NSValue valueWithCGPoint:CGPointMake(midPoint.x, midPoint.y - 10)];
    NSValue *point3 = [NSValue valueWithCGPoint:CGPointMake(midPoint.x   10, midPoint.y)];
    [points addObject:point1];
    [points addObject:point2];
    [points addObject:point3];


    [points autorelease];
    return points;
}
 

Я получаю SIGABRT , как только добавляю point1 в points массив.

Ниже приведена полученная трассировка стека:

 2011-10-27 10:43:36.939 Graphing Calculator[7056:207] -[__NSSet0 addObject:]: unrecognized selector sent to instance 0x4b57900
2011-10-27 10:43:36.943 Graphing Calculator[7056:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSSet0 addObject:]: unrecognized selector sent to instance 0x4b57900'
*** Call stack at first throw:
(
    0   CoreFoundation                      0x00dc95a9 __exceptionPreprocess   185
    1   libobjc.A.dylib                     0x00f1d313 objc_exception_throw   44
    2   CoreFoundation                      0x00dcb0bb -[NSObject(NSObject) doesNotRecognizeSelector:]   187
    3   CoreFoundation                      0x00d3a966 ___forwarding___   966
    4   CoreFoundation                      0x00d3a522 _CF_forwarding_prep_0   50
    5   Graphing Calculator                 0x000073cd -[GraphViewController pointsToPlot:]   1037
    6   Graphing Calculator                 0x00006895 -[GraphView drawRect:]   965
    7   UIKit                               0x00053187 -[UIView(CALayerDelegate) drawLayer:inContext:]   426
    8   QuartzCore                          0x016b3b5e -[CALayer drawInContext:]   143
    9   QuartzCore                          0x016bfe47 _ZL16backing_callbackP9CGContextPv   85
    10  QuartzCore                          0x0160d1f7 CABackingStoreUpdate   2246
    11  QuartzCore                          0x016bfd24 -[CALayer _display]   1085
    12  QuartzCore                          0x016b627d CALayerDisplayIfNeeded   231
    13  QuartzCore                          0x0165b0c3 _ZN2CA7Context18commit_transactionEPNS_11TransactionE   325
    14  QuartzCore                          0x0165c294 _ZN2CA11Transaction6commitEv   292
    15  QuartzCore                          0x0165c46d _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv   99
    16  CoreFoundation                      0x00daa89b __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__   27
    17  CoreFoundation                      0x00d3f6e7 __CFRunLoopDoObservers   295
    18  CoreFoundation                      0x00d081d7 __CFRunLoopRun   1575
    19  CoreFoundation                      0x00d07840 CFRunLoopRunSpecific   208
    20  CoreFoundation                      0x00d07761 CFRunLoopRunInMode   97
    21  GraphicsServices                    0x010011c4 GSEventRunModal   217
    22  GraphicsServices                    0x01001289 GSEventRun   115
    23  UIKit                               0x00029c93 UIApplicationMain   1160
    24  Graphing Calculator                 0x000021d9 main   121
    25  Graphing Calculator                 0x00002155 start   53
)
terminate called after throwing an instance of 'NSException'
 

Может кто-нибудь, пожалуйста, объясните мне, что я здесь делаю не так?

Ответ №1:

Изменить

     NSMutableArray *points = [[NSSet alloc] init];
 

Для

     NSMutableArray *points = [[NSMutableArray alloc] init];
 

Ответ №2:

Вы создаете и инициализируете NSSet и сохраняете его в качестве ссылки для NSMutableArray.

Измените следующую строку:

 NSMutableArray *points = [[NSSet alloc] init];
 

К этой строке:

 NSMutableArray *points = [[NSMutableArray alloc] initWithCapacity:3];