【问题标题】:Calling classes from seperate class in a program从程序中的单独类调用类
【发布时间】:2012-01-30 14:37:11
【问题描述】:

我有一个 xcode 项目,它有 2 个类 - Stem 和 Player,我试图确保我的代码从面向对象的角度来看是可靠的,我相信我的 Player 类访问我的 Stem 中的信息是可以接受的编程实践类。

我想从 stem 中的数组中访问索引 - 我可以在视图控制器中使用

stem.index[i]

当我尝试从玩家那里执行此操作时,我不允许这样做,因为没有声明词干。我尝试将 Stem.h 导入到我的 Player.m 文件中并在播放器中声明词干(类似于在视图控制器中执行此操作的方式),但结果却出现错误(在“词干”之前的预期说明符-限定符列表)。

这样做的正确方法是什么?请原谅任何松散的术语使用,因为我对此比较陌生。在此先感谢:)

编辑

这里有一些代码可以说明一些事情,在 viewController 我声明了 stem & player

#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import "Stem.h"
#import "Player.h"

@interface TestApp_v1ViewController : UIViewController {

Stem *stem;
Player *player;

我在 viewController.m 中分配和初始化我的两个对象 stem & player

- (void)viewDidLoad {
     [super viewDidLoad];
 NSLog(@"Init Successful");

 [self loadMOV];
 [self setupInterface];

 stem = [[Stem alloc] init];
 player = [[Player alloc] init]; 

}

然后我移到 Stem.h 并再次声明 stem(这样当 stem.h 被导入 player.h 时,玩家可以访问这个词干 - 根据 glogic 的评论)

#import <Foundation/Foundation.h>

@interface Stem : NSObject {

int *index;

int numberOfStems;

Stem *stem;

}

@property(nonatomic,readwrite) int *index;
@property(nonatomic, retain) Stem *stem;

Player.h 看起来像这样:

//  Player.h
#import <Foundation/Foundation.h>
#import "Stem.h"

@interface Player : NSObject {

NSMutableArray *player1;

}

@property(nonatomic,retain) NSMutableArray *player1;

-(void) playAudio;

@end

最后在 Player.m 中我尝试访问索引数组

#import "Player.h"

@implementation Player
@synthesize player1;


-(void)playAudio {

NSLog(@"play audio called");

NSLog(@"index[0] is: %i", stem.index[0]);

}

@end

我仍然被告知 stem 是未声明的,有什么想法吗?

编辑 #2 - 添加基本程序

我希望这被认为没问题,但我决定发布我的程序(精简到最基本的内容)。我认为这可能是解决问题的唯一方法——因为跨班级发生了很多事情。我一直在努力让它工作好几个小时啊……

我在 viewController 中分配并初始化了我的 stem 和 player 对象 - 我认为这是解决此问题的最佳方法,但也许有更好的方法。

//Part (i)
//  TestApp_v1ViewController.h

#import <UIKit/UIKit.h>
#import <AVFoundation/AVAudioPlayer.h>
#import "Stem.h"
#import "Player.h"

@interface TestApp_v1ViewController : UIViewController {

Stem *stem;
Player *player;

}

@property(nonatomic, retain) Stem *stem;
@property(nonatomic, retain) Player *player;

@end

//Part (ii)
//  TestApp_v1ViewController.m

#import "TestApp_v1ViewController.h"
#import <MediaPlayer/MediaPlayer.h>

@implementation TestApp_v1ViewController

@synthesize stem;
@synthesize player;

 // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
 - (void)viewDidLoad {
 [super viewDidLoad];
 NSLog(@"Init Successful");

 stem = [[Stem alloc] init];
 [stem loadURLs];

 player = [[Player alloc] init];
 [player playAudio];

 int index = stem.value;
 NSLog(@"r is: %i", index);   //checking to see if I can get a value from the index array - this works fine, so 'value' can be accessed from the viewController

}

在这里我声明了一个 int 数组和我想稍后从我的播放器访问的 int“值”(这就是问题所在)

//Part (iii)
//  Stem.h

#import <Foundation/Foundation.h>

@interface Stem : NSObject {

NSMutableArray *urlArray;

int *index;

int value;

int numberOfStems;

Stem *stem;

}

- (void)loadURLs;
- (void)randomiseAudioForInitialPlay;

@property(nonatomic,retain) NSMutableArray *urlArray;
@property(nonatomic,readwrite) int *index;
@property(nonatomic,readwrite) int numberOfStems;
@property(nonatomic,readwrite) int value;
@property(nonatomic, retain) Stem *stem;

@end

//Part (iv)
//  Stem.m

#include <stdio.h>
#import "Stem.h"


@implementation Stem

@synthesize numberOfStems;
@synthesize urlArray;
@synthesize index;
@synthesize stem;
@synthesize value;

- (void)loadURLs
{
NSLog(@"Loading URLs");
numberOfStems = 20;
urlArray = [[NSMutableArray alloc] init];

for ( int i = 1; i <= numberOfStems; i++ ) {
    NSString *soundName = [NSString stringWithFormat:@"stem-%i", i];
    NSString *soundPath = [[NSBundle mainBundle] pathForResource:soundName ofType:@"mp3"];
    NSURL *soundFile = [[NSURL alloc] initFileURLWithPath:soundPath];
    [urlArray addObject:soundFile];
    [soundFile release];

}

[self randomiseAudioForInitialPlay];

}


- (void)randomiseAudioForInitialPlay 
{
index = malloc(numberOfStems*sizeof(int));
for (int i = 0; i < numberOfStems; i++)
{
    index[i] = i;
}

for (int i = (numberOfStems - 1); i > 0; i--)
{

    int randomIndex = arc4random() % i;
    int tmp = index[i];
    index[i] = index[randomIndex];   
    index[randomIndex] = tmp;

}

value = self.index[10];        //this is what needs to be accessed later, from player

NSLog(@"value at index 10 is:%i", value);

}

@end

这里我包含了“Stem.h”,因为玩家需要 stem 才能返回 stem.value

//Part (v)
//  Player.h

#import <Foundation/Foundation.h>
#import "Stem.h"

@interface Player : NSObject {

Player *player;

}

@property(nonatomic, retain) Stem *stem;

@property(nonatomic, retain) Player *player;

-(void) playAudio;

@end

这是出错的地方,我的 NSLog 语句告诉我值是 0,即使我可以看到它(例如)在词干中是 14。编译器也没有报错。

//Part (vi)
//  Player.m

#import "Player.h"

@implementation Player

@synthesize player;
@synthesize stem;


-(void)playAudio {

int value = stem.value;

NSLog(@"value is:%i", value );

}

@end

这是我在面向对象项目中的第一次正确尝试,所以我在工作中学习,关于为什么我不能在我的 Player 类中访问 stem.value 的任何建议?

我对这样一个程序中的各种对象如何相互交互(以及正确的语法)的想法仍然很模糊,所以请原谅我在我的代码中出现疯狂的 n00b 错误:)

【问题讨论】:

  • 请发布更多代码,以便我们更好地理解您的问题
  • 我用一些相关代码编辑了我的帖子

标签: objective-c xcode


【解决方案1】:

您在播放器中的哪个位置声明词干?如果您在 player.h 中声明它,那么您将需要在 player.h 而不是 player.m 中导入 stem.h。

edit:是的,它仍然未声明,因为您在视图控制器而不是播放器中声明了词干。嗯,这里似乎有些不正常。这真的取决于你的代码将如何实际工作

#import Stem.h

@interface Player : NSObject {

NSMutableArray *player1;

}

@property(nonatomic,retain) NSMutableArray *player1;
@property(nonatomic,retain) Stem *stem;

-(void) playAudio;

@end

#

import "Player.h"

@implementation Player
@synthesize player1, stem = _stem;


-(void)playAudio {

NSLog(@"play audio called");

NSLog(@"index[0] is: %i", _stem.index[0]);//stem.index[0] will be a problem here as its not a c array

}

@end

然后在你的控制器中

player.stem = stem;

我不确定你为什么要在 stem 类中创建一个 stem 指针。

@interface Stem : NSObject {

int *index;

int numberOfStems;
}

@property(nonatomic,readwrite) int *index;

如果它是你想要的一个词干数组,那么在控制器中创建它

编辑:在你有线条之后

player = [[Player alloc] init];
 [player playAudio];

添加

player.stem = stem;

您必须将播放器中的指针分配给您在视图控制器中创建的茎

【讨论】:

  • 这应该是评论而不是答案
  • 为什么?我说在 player.h 中导入 stem.h 作为我的答案。反对票似乎很苛刻,但我学不会接受它
  • 我实际上犯了那个错误,所以我发现答案很有用,不幸的是它并没有完全解决我的问题......
  • 感谢 glogic,我试了一下,但它并没有成功——我想如果我发布一个程序的线程版本可能会更清楚,这样更容易找出在哪里问题出在哪里。
【解决方案2】:

最好的方法是在Stem 类中创建一个方法,例如:

值 = [词干 valueAtIndex:i];

这样可以减少耦合,并且值在 Stem 类中的保存方式不会暴露,并且可以在以后根据需要进行更改,而无需宣传访问调用。

【讨论】:

  • 好吧,这比我目前的方法好,谢谢,我仍然无法让玩家“看到”词干……我已经在上面发布了代码。
  • 您有没有机会将目光投向我的代码 CocoaFu?将不胜感激:)
  • 晚饭后我去看看。
猜你喜欢
  • 1970-01-01
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 2017-12-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-24
相关资源
最近更新 更多