Получить доступ к возвращаемому значению метода делегата - PullRequest
0 голосов
/ 07 ноября 2011

Я только что написал метод делегата, который должен возвращать массив, который я создал внутри этого метода. Вот код для этого:

- (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 Ответ

1 голос
/ 07 ноября 2011

В вашем классе (классе, соответствующем протоколу и получающем обратный вызов), объявите переменную экземпляра и свойство для NSMutableArray (или вы можете преобразовать его в массив, если он не изменится снова после того, как вы впервые его получите).

Когда вызывается ваш метод делегата, присвойте свой portArray свойству класса перед возвратом. Затем ваш экземпляр класса имеет ссылку на portArray, к которому может обращаться любой метод в вашем классе. Вам не нужно явно выделять / инициализировать массив для этого, потому что у вас уже есть массив в памяти к моменту завершения вашего метода обратного вызова - назначение массива вашему свойству класса сохраняет его, тем самым подтверждая владение за пределами области действия. обратный вызов делегата.

Вы можете вызывать свой собственный метод из обратного вызова делегата (receiveString), и он будет иметь доступ к вашему массиву.

В вашем заголовке (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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...