我刚写了一个委托方法,它将返回一个数组,我在这个方法中创建了。这是代码:
- (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部分? 有没有办法在另一种方法中复制这个数组?
谢谢 塞巴斯蒂安
答案 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;
}