可以访问委托方法的返回值

时间:2011-11-06 21:14:49

标签: objective-c arrays cocoa delegates

我刚写了一个委托方法,它将返回一个数组,我在这个方法中创建了。这是代码:

- (NSArray *) receivedString:(NSString *)rx{
NSString *portsetting = [[NSString alloc] init];
NSMutableArray *portArray = [[NSMutableArray alloc] initWithCapacity:[portsetting 
length]];
portsetting = rx;

for (int i = 0; i < [portsetting length]; i++)
{
    NSString *ichar = [NSString stringWithFormat:@"%c",[portsetting 
characterAtIndex:i]];
    [portArray addObject:ichar];
}

return portArray;
}

这个委托方法是我导入的库的一部分,不是由我自己调用,而是由我的代码中搜索该方法的程序调用。到目前为止一切都很好......一切都很好。

但事情就是这样。我想在我的代码中访问这个返回的数组,但我不想调用该方法本身,因为我没有任何输入值。这完全由“程序”处理......难以解释自己。

所以在调用该方法之后,我想通过我自己编写的方法访问这个数组。但到目前为止我还没有线索,怎么做......有人可以帮助我吗?

是否有必要在此函数外部初始化数组才能访问它?我该如何实现呢?在代码的init部分? 有没有办法在另一种方法中复制这个数组?

谢谢 塞巴斯蒂安

1 个答案:

答案 0 :(得分:1)

你的类(符合协议并接收回调的类)中,为NSMutableArray声明一个实例变量和属性(或者如果它不会改变,你可以将它强制转换为数组在你第一次收到之后再次)。

调用委托方法时,请在返回之前将portArray分配给类属性。然后,您的类实例具有对portArray的引用,该引用可以由类中的任何方法访问。你不需要为此明确地分配/初始化一个数组,因为你的回调方法完成时已经在内存中有了数组 - 将数组赋给你的类属性保留了它,因此断言所有权超出了代表回调。

您可以在委托回调(receivedString)中调用自己的方法,并且可以访问您的数组。

在标题(myClass.h)中:

@interface myClass <ConformsToReceivedStringProtocol>
{
@private
    NSMutableArray *portArray_;
}

@property (nonatomic, retain) NSMutableArray *portArray;

-(void) myMethodThatUsesPortArray;

在您的实现中(myClass.m)

@implementation myClass

@synthesize portArray = portArray_;

-(NSArray *) receivedString:(NSString *)string
{

//do everything you're already doing

NSMutableArray *myPortArray;

[self setPortArray:myPortArray];

[self myMethodThatUsesPortArray];

return myPortArray;

}

-(void) myMethodThatUsesPortArray 
{

//do whatever you want with

NSMutableArray *myArray = [self portArray];
}

//don't forget to release the property
-(void) dealloc 
{

[self setPortArray:nil];
[portArray_ release];

[super dealloc];
}

最后一个选项就是在返回之前直接将数组传递给您自己的方法,避免定义ivars和属性,但要求您自己管理数组的内存:

- (void) myMethodThatUsesArray:(NSMutableArray *)portArray
{
[portArray retain];
//do something with portArray and then release ownership
[portArray release];
}

-(NSArray *) receivedText:(NSString *)string
{
//assume we have a myPortArray (balanced in memory)
[self myMethodThatUsesArray:myPortArray]
return myPortArray;
}