0

我希望我不要在这里刮胡子!我尝试在我的模型类中调用一个方法并将一个对象返回给调用控制器。

我的 AppDelegate.h:

#import <Cocoa/Cocoa.h>
@class ResultItem;

@interface AppDelegate : NSObject <NSApplicationDelegate>{
    ResultItem *ri;
}
-(void)calculateResults;
@end

我的 AppDelegate.m:

#import "AppDelegate.h"
#import "ResultItem.h"

@implementation AppDelegate
    //other stuff

- (void)calculateResults{
    self->ri = [[ResultItem alloc]init];         //ResultItem is my model
    [xx calculateUniformDistribution:(double)x1
            withxMinus:(double)x2
            withxAvg:(double)x3
            withCount:(double)numberCounter];
} ...

我的 ResultItem.h

#import <Foundation/Foundation.h>
@interface ResultItem : NSObject

-(NSMutableDictionary *)calculateUniformDistribution:(double)xPlus
        withxMinus:(double)xMinus
        withxAvg:(double) xAvg
        withCount:(int) count;

我的 ResultItem.m

#import "ResultItem.h"
@implementation ResultItem

- (NSMutableDictionary *)calculateUniformDistribution:(double)xPlus
        withxMinus:(double)xMinus
        withxAvg:(double)xAvg
        withCount:(int)count{

NSMutableArray *dimensionRandomArray = [[NSMutableArray alloc] init];
NSMutableDictionary *newResultItem = [[NSMutableDictionary alloc]init];

//calculation loop

[newResultItem setValue:[NSNumber numberWithDouble:max] forKey:@"maxValue"];
[newResultItem setValue:[NSNumber numberWithDouble:min] forKey:@"minValue"];
[newResultItem setValue:[NSNumber numberWithDouble:avg] forKey:@"averageValue"];
[newResultItem setValue:dimensionRandomArray forKey:@"randomValueArray"];

return newResultItem;
}

ResultItem 方法被调用得很好。我想创建一个NSMutableDictionary对象,稍后我需要在我的 AppDelegate 中处理它。

我的问题:

  1. 之后如何访问newResultItem我的AppDelegate方法。
  2. 我不知道如何newResultItem在我的AppDelegate方法中使用键添加更多值calculateResults。有人可以帮我吗?
  3. 谁是newResultItem对象ResultItem的实际所有者AppDelegate
  4. 像这样设置代码是否看起来不对。我尽量遵循 MVC 模式。

请不要打我...

4

2 回答 2

1

理想情况下,您的 ResultsItem 应该只封装属性而没有计算方法。这是一个简单的示例(要添加更多值,您可以使用这样的字典):

   @implementation  ResultItem  
   @synthesize max, min, ...;     
   - (id)initWithDictionary:(NSDictionary*)dictionary {
      if ((self = [super init])) {
          self.max = [dictionary objectForKey:@"maxValue"];
          self.min = [dictionary objectForKey:@"minValue"];
          ......
                     }
      return self; 
    }
    @end

接下来我将创建一个计算类,您可以在其中执行所有计算方法,像这样创建 ResultItem 对象

ResultItem *resultItem = [[ResultItem alloc] initWithDictionary:yourDictionary];

并将此对象返回给您的 AppDelegate。

于 2013-02-26T22:37:42.417 回答
0

首先,我建议摆脱 ResultItem 类。我会用控制器类中的方法替换它 - 在您的情况下,将 calculateUniformDistribution 方法移动到 AppDelegate。或者至少将 calculateUniformDistribution 移动到适当的模型类(您的应用程序处理汽车、公共汽车、飞机等的实际对象)。

至于实际返回字典和添加值,这是一个简化的示例,假设您坚持当前的模式:

在 AppDelegate.m

self.ri = [[ResultItem alloc] init];
NSMutableDictionary* dict = [self.ri calculateUniformDistribution:(double)x1
        withxMinus:(double)x2
        withxAvg:(double)x3
        withCount:(double)numberCounter];
[dict setValue:[NSNumber numberWithDouble:1.0] forKey:@"additionalKey"];

在 ResultItem.m 中

NSMutableArray* dimensionRandomArray = [[NSMutableArray alloc] init];
NSMutableDictionary* returningDict = [[NSMutableDictionary alloc] init] autorelease];

//calculation loop

[newResultItem setValue:[NSNumber numberWithDouble:max] forKey:@"maxValue"];
[newResultItem setValue:[NSNumber numberWithDouble:min] forKey:@"minValue"];
[newResultItem setValue:[NSNumber numberWithDouble:avg] forKey:@"averageValue"];
[newResultItem setValue:dimensionRandomArray forKey:@"randomValueArray"];
[dimensionRandomArray release];

return newResultItem;

注意returningDict 的自动释放和dimensionRandomArray 的释放。此外,您必须在之后释放 self.ri。如果你想在 AppDelegate 中保留 dict,你必须添加retain-release。

于 2013-02-26T22:37:28.613 回答