iOS - NSMutableArray и Block Copy - PullRequest
       5

iOS - NSMutableArray и Block Copy

0 голосов
/ 02 марта 2011

В настоящее время я пытаюсь использовать блочную копию в моем текущем проекте. Структура копии - это NSMutableArray, который содержит NSIntegers, NSStrings, другой NSMutableArray и два объекта ... Эти объекты в свою очередь содержат NSStrings. Массив содержит объекты, которые содержат NSInteger, и два объекта, которые содержат строки ...

Я полагаю, что должен использовать метод Block Copy для копирования объектов ... Код ниже ...

Я знаю, что код не выпускается должным образом ... Я пытался уменьшить код для вашей выгоды.

Любое понимание, которое ты мог бы пролить, было бы потрясающим.

//Main controller Excerpt
//Insert Position Information into temporary node point... Node Points can have multiple Positions (or rather you can face multiple directions at the node. Each Node has 3-4 of these.
[newNode.positionArray insertObject:[newPosition copy] atIndex:currentPosition];
Insert the temporary node into the Node Array.
[nodeArray insertObject:[newNode copy] atIndex:count];

//Main Controller Excerpt

//
//  Node.h
//

#import <Foundation/Foundation.h>

@class Sequence;
@class Position;

@interface Node : NSObject  {
    NSInteger Id;
    NSInteger currentPosition;
    NSString *title;
    NSMutableArray *positionArray;
    Sequence *forwardSequence;
    Sequence *backSequence;
}

-(id) copyWithZone: (NSZone *) zone;

@property (nonatomic, assign) NSInteger Id;
@property (nonatomic, assign) NSInteger currentPosition;
@property (nonatomic, assign) NSString *title;
@property (nonatomic, retain) NSMutableArray *positionArray;
@property (nonatomic, retain) Sequence *forwardSequence;
@property (nonatomic, retain) Sequence *backSequence;

@end


//
//  Node.m
//

#import "Sequence.h"
#import "Position.h"
#import "Node.h"

@implementation Node

@synthesize Id;
@synthesize currentPosition;
@synthesize positionArray;
@synthesize title;
@synthesize forwardSequence;
@synthesize backSequence;

-(id) copyWithZone: (NSZone *) zone {
    Node *nodeCopy = [[Node allocWithZone: zone] init];

    nodeCopy.Id = Id;
    nodeCopy.currentPosition    = currentPosition;
    nodeCopy.positionArray      = [positionArray copy];
    nodeCopy.title              = title;
    nodeCopy.forwardSequence    = [forwardSequence copy];
    nodeCopy.backSequence       = [backSequence copy];

    return nodeCopy;
}

@end


//
//  Position.h
//

#import <Foundation/Foundation.h>

@class Sequence;

@interface Position : NSObject <NSCopying> {
    NSInteger Id;
    Sequence *leftSequence;
    Sequence *rightSequence;
}

@property (nonatomic, assign) NSInteger Id;
@property (nonatomic, retain) Sequence *leftSequence;
@property (nonatomic, retain) Sequence *rightSequence;

-(id) copyWithZone: (NSZone *) zone;

@end

//
//  Position.m
//

#import "Sequence.h"
#import "Position.h"

@implementation Position

@synthesize Id;
@synthesize leftSequence;
@synthesize rightSequence;

-(id) copyWithZone: (NSZone *) zone {
    Position *positionCopy = [[Position allocWithZone: zone] init];

    positionCopy.Id             = Id;
    positionCopy.leftSequence   = [leftSequence copy];
    positionCopy.rightSequence  = [rightSequence copy];

    return positionCopy;
}

@end

//
//  Sequence.h
//

#import <Foundation/Foundation.h>

@interface Sequence : NSObject <NSCopying> {
    NSInteger numberOfFrames;
    NSString *imageNameScheme;
    NSString *endFrame;
}

-(id) copyWithZone: (NSZone *) zone;

@property (nonatomic, assign) NSInteger numberOfFrames;
@property (nonatomic, copy) NSString *imageNameScheme;
@property (nonatomic, copy) NSString *endFrame;

@end

//
//  Sequence.m
//  MCIT
//

#import "Sequence.h"

@implementation Sequence

@synthesize numberOfFrames;
@synthesize imageNameScheme;
@synthesize endFrame;

-(id) copyWithZone: (NSZone *) zone {
    Sequence *sequenceCopy = [[Sequence allocWithZone: zone] init];

    sequenceCopy.numberOfFrames     = numberOfFrames;
    sequenceCopy.imageNameScheme    = imageNameScheme;
    sequenceCopy.endFrame           = endFrame;

    return sequenceCopy;
}
@end

Работает как шарм, теперь спасибо всем. : D

1 Ответ

2 голосов
/ 02 марта 2011

Если вы намерены сделать этот класс копируемым, то вам нужно объявить, что он соответствует протоколу NSCopying, например:

@interface Node: NSObject <NSCopying> {

Падение объявления протокола может привести к тому, что другие объектысчитают, что класс не может быть скопирован, даже если у него есть метод copyWithZone:.

...