在程序中从单独的类调用类

时间:2012-01-30 14:37:12

标签: objective-c xcode

我有一个xcode项目有2个类 - Stem&玩家,我试图从面向对象的角度确保我的代码是可靠的,我相信我的Player类可以接受我的Stem类中的信息。

我想从stem中的数组访问索引 - 我可以使用

从我的视图控制器执行此操作
stem.index[i]

当我尝试从玩家那里做这件事时我不被允许,因为干是未宣布的。我已经尝试将Stem.h导入我的Player.m文件&在播放器中声明词干(类似于在视图控制器中如何做到这一点),只是为了获得错误(在'Stem'之前预期的说明符 - 限定符列表)。

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

修改

这里有一些代码可能会对事物有所了解,在viewController中我声明了干和&播放器

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

@interface TestApp_v1ViewController : UIViewController {

Stem *stem;
Player *player;

我分配&amp;初始化我的两个对象干&amp; viewController.m中的播放器

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

 [self loadMOV];
 [self setupInterface];

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

}

然后我转到Stem.h,我再次声明词干(这样当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

我仍然被告知词干是未宣布的,有什么想法吗?

编辑#2 - 添加裸机程序

我希望这被认为是好的,但我决定发布我的程序(简化为基本要素)。我认为这可能是解决问题的唯一方法 - 因为很多课程都在进行。我一直试图让这个工作几个小时,现在......#/ p>

我分配了&amp;初步化我的干&amp; viewController中的播放器对象 - 我认为这是解决此问题的最佳方法,但也许有更好的方法。

//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数组&amp;我希望稍后从我的播放器访问的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错误:)

2 个答案:

答案 0 :(得分:3)

你在哪里宣布玩家的干?如果你在player.h中声明它,那么你需要在player.h中导入stem.h而不是player.m。

编辑:是的,它仍然未声明,因为你在视图控制器中声明了干,而不是播放器。嗯这似乎是个不了解的事情。这实际上取决于你的代码实际工作方式

#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;

我不知道为什么你在干类中创建一个干指针。

@interface Stem : NSObject {

int *index;

int numberOfStems;
}

@property(nonatomic,readwrite) int *index;

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

编辑:你有行

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

添加

player.stem = stem;

您必须将播放器中的指针指定给您在视图控制器中创建的词干

答案 1 :(得分:2)

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

value = [stem valueAtIndex:i];

这样就可以减少耦合,并且Stem类中保存值的方式不会公开,如果需要,可以在以后更改,而不会传播访问调用。