我创建了一个模型,我想要保存一些我需要能够在其他两个类中访问的数据。
我尝试在尝试向其添加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并且仍然对语言不熟悉所以我确信这个过程只有一些简单的事情我不会理解。
答案 0 :(得分:1)
self.selectedLetters = [NSMutableArray init];
应该是:
self.selectedLetters = [[NSMutableArray alloc] init];
您还需要在alloc init
课程的某个地方CCModel
SKLetterNode
。如果不这样做,alloc init
上的selectedLetters
将永远不会被调用,等等。
答案 1 :(得分:1)
其他两张海报指出了你的代码有两个问题。 (不实例化CCModel对象,并调用[NSMutableArray init]而不是[[NSMutableArray alloc] init]。
您的代码的第三个问题是这一行:
[self.model.selectedLetters arrayByAddingObject:self];
没有意义。这行代码创建了一个新的不可变数组,然后您可以将其放在地板上。解决其他2个问题后,您希望使用这样的代码
[self.model.selectedLetters addObject: self];
你真的想在阵列中添加“self”吗? (一个SKLetterNode对象)
答案 2 :(得分:0)
如果您尝试使用MVC,则不应将视图对象放入模型中。有一个单独的模型对象代表您的数据模型。
与MVC相关,你不应该从视图中引用你的模型。使用您的控制器(可能是SK应用程序中的场景)将模型连接到视图。
内存管理:如果我认为“模型”是每个视图共享并在视图外部创建的内容是正确的:模型保留视图,视图保留模型。这会像筛子一样泄漏。连接应该根本不存在,但是如果你想保留它,那么从视图到模型的连接应该很弱:
@property(weak, nonatomic) CCModel* model;
正如Duncan指出的那样,arrayByAddingObjects在那里没有意义。 [NSMutableArray init]甚至不应该编译:总是修复你的警告,它们几乎总是在你的代码中指出错误。
还要考虑:如果self.model.selectedLetters为nil,问题可能是self.model为nil,而不是model.selectedLetters为nil!