0

我创建了一个模型,我想保存一些我需要能够在其他两个类中访问的数据。我已经尝试在尝试添加之前和之后记录我的数组self,但它之前和之后都是空的。我已经尝试了我能想到的一切,加上大量的谷歌搜索,但我无法让它发挥作用。这是我创建的用于将一些数据存储到的模型:

// CCModel.h

#import <Foundation/Foundation.h>
@interface CCModel : NSObject
// this is the array that I want to store my SKLetterNodes in
@property(strong, nonatomic) NSMutableArray* selectedLetters;
@end

// CCModel.m

#import "CCModel.h"

@implementation CCModel
- (id)init
{
    self = [super init];
    if (self) {
        // not really to sure if this is the right approach to init the array that I'm going to need
        self.selectedLetters = [NSMutableArray init];
    }
    return self;
}
@end

这是我试图从中访问 NSMutableArray 的类

// SKLetterNode.h

#import <SpriteKit/SpriteKit.h>
#import "CCModel.h"

@class SKLetterNode;

@protocol LetterDragDelegateProtocol <NSObject>
-(void)letterNode:(SKLetterNode*)letterNode didDragToPoint:(CGPoint)pt;
@end

@protocol LetterWasTouchedDelegateProtocol <NSObject>
-(void) touchedPoint:(CGPoint)touchedPoint;
@end

@interface SKLetterNode : SKSpriteNode
// Here is where I'm creating a property to access my model's NSMutableArray
@property(strong, nonatomic) CCModel* model;

....
@end

// SKLetterNode.m - 我将只包含相关方法,因为其他一切都在这个类中工作

-(void)touchesBegan:(NSSet *)touches withEvent:(UIEvent *)event {

    if (!self.isSelected) {

        SKLetterNode* lastLetter = [self.model.selectedLetters lastObject];

        if (lastLetter.bottomOrTop != self.bottomOrTop || self.model.selectedLetters.count == 0) {

            CGSize expandSize = CGSizeMake(self.size.width * expandFactor, self.size.height * expandFactor);

            SKAction* sound = [SKAction playSoundFileNamed:@"button.wav" waitForCompletion:NO];
            [self runAction:sound];

            self.isSelected = YES;
            self.physicsBody = [SKPhysicsBody bodyWithRectangleOfSize:expandSize];
            self.physicsBody.affectedByGravity = NO;
            self.physicsBody.allowsRotation = NO;

            if (!self.model.selectedLetters) {
                // Here is where I'm trying to init my array by adding an object
                [self.model.selectedLetters arrayByAddingObject:self];
            } else {
                // The array must already be initialized, so add the object
                [self.model.selectedLetters addObject:self];
            }


        }

    }
}

正如您在 if 块中看到的那样,如果数组未初始化,(!self.model.selectedLetters)我试图通过添加对象来初始化数组。self否则,我添加对象。我正在尝试使用objective-c,并且对这门语言仍然很陌生,所以我确信这个过程有一些简单的东西我不会完全理解。

4

3 回答 3

1
self.selectedLetters = [NSMutableArray init];

应该:

self.selectedLetters = [[NSMutableArray alloc] init];

你也需要在课堂上alloc initCCModel某个地方。SKLetterNode如果你不这样做,alloc initonselectedLetters将永远不会被调用,等等。

于 2013-10-30T01:10:34.800 回答
1

其他 2 张海报指出您的代码存在 2 个问题。(不实例化 CCModel 对象,并调用 [NSMutableArray init] 而不是 [[NSMutableArray alloc] init]。

您的代码的第三个问题是这一行:

[self.model.selectedLetters arrayByAddingObject:self];

没有意义。那行代码创建了一个新的不可变数组,然后您将其放在地板上。解决其他 2 个问题后,您想使用这样的代码

[self.model.selectedLetters addObject: self];

你真的想将“自我”添加到数组中吗?(一个 SKLetterNode 对象)

于 2013-10-30T01:31:24.720 回答
0

如果您尝试使用 MVC,则不应将视图对象放入模型中。有一个单独的模型对象代表您的数据模型。

也与 MVC 相关,您不应该从视图中引用您的模型。使用您的控制器(可能是 SK 应用程序中的场景)将模型连接到视图。

内存管理:如果我假设“模型”是每个视图都共享并且在视图之外创建的东西是正确的:模型保留视图,视图保留模型。这会像筛子一样泄漏。连接根本不应该存在,但如果你想保留它,从视图到模型的连接应该很弱:

@property(weak, nonatomic) CCModel* model;

正如邓肯所指出的,arrayByAddingObjects 在那里没有意义。[NSMutableArray init] 甚至不应该编译:总是修复你的警告,它们几乎总是表明你的代码中有错误。

还要考虑:如果 self.model.selectedLetters 为 nil,问题可能是 self.model 为 nil,而不是 model.selectedLetters 为 nil!

于 2013-10-30T08:16:03.323 回答