кто выпустил мой объект на файле обработчика?

Я - новичок на мире разработки iPhone..

Я запустил новый проект, я использовал его для тестирования то, что я узнал о цели c, он в основном отправляет и получает данные из моего локального сервера, затем, я храню некоторые из тех данных в классе, он хорошо работает. Все находится на командной строке.

мое определение класса:

@interface MyClient : NSObject {

    NSString *name;

    NSMutableDictionary *in, *out;
}
-(BOOL) send;
-(BOOL) receive;

Я настроил значения, преобразовываю их в xml и отправляю их на свой сервер. мой сервер отвечает, я добираюсь "в" значениях, имя является строкой, которая содержит некоторое специальное значение "в" значениях.

Проблема возникает, когда я пытаюсь смешать свой код с некоторым примером/демонстрацией, я нашел в Интернете, демонстрация приносит некоторый MVC?? файлы (*Handler.h/m, *ViewController.h/m, *AppDelegate.h/m). Существует одна кнопка (btnStart), если я нажимаю ту кнопку, она звонит

- (IBAction) start: (id) sender;

все хорошо работает, если я поместил отправление и получаю вызовы в методе запуска.

НО...

Я попробовал два, имеют к кнопкам: отправьте и получите, обе работы (я судил их и отправку вывода к консоли), оба метода:

 1) - (IBAction) send: (id) sender;
 2) - (IBAction) receive: (id) sender;

обе внутренней части *Handler.m

затем: метод 1) будет просто работать [myClient, отправляют]; метод 2) будет просто работать [myClient, получают];

это не работает, это бросает меня ошибка "BAD_ACCESS", я отладил (я использовал NSZombie..)...

Я нашел, что данные, которые хранятся (в, имя), когда назван [myClient, отправляют], released/killed/does не, существуют при вызове [myClient получают]

Я не назвал [myClient выпуск] или что-то как этот.

вопросы: что я делаю неправильно? где это должно кодировать (метод 1) и 2)) быть?

спасибо.

ОБНОВЛЕННЫЙ: Вот некоторый код, это огромно, таким образом, я имею копию и вставил свидетельствующую часть, сообщите мне, нужно ли Вам больше кода, Спасибо!

// MyClass.h

@interface MyClient : NSObject {

    NSString *name;
    NSString *id;

    NSMutableDictionary *paramIn, *paramOut;
}
-(BOOL) send;
-(BOOL) receive;
-(void) setParam:(NSString *) key value: (NSString *) value;
-(NSString *) getParam:(NSString *) key;

//MyClass.m
#import "MyClass.h"
#import "TBXML.h"

@implementation MyClass
-(id) init {
    if ( !(self= [super init]) ){
        return nil;
    }

    paramIn=[[NSMutableDictionary alloc] init] ;
    paramOut=[[NSMutableDictionary alloc] init] ;

    return self;
} 

-(void) setParam:(NSString *) key value: (NSString *) value {
    [paramOut setObject:value   forKey:key];
}
-(NSString *) getParam:(NSString *) key {
    return [paramIn objectForKey:key];
}
-(BOOL) send{
    NSString *xml=[self getXML];
    // url conection ...
    // NSURLReq ...
    NSData *data= [ buffer  dataUsingEncoding: NSASCIIStringEncoding];
    TBXML * tbxml = [[TBXML tbxmlWithXMLData: data] retain];

    BOOL r=[self getXML: tbxml usingThisDictionary: &paramIn];

    if (r == YES) {
        name = [self getParam:@"nameResponse"];
        id =[self getParam:@"myId"];
    }
    [xml release];
    [data release];
    [tbxml release];

    return r;
}
-(BOOL) getXML:(TBXMLElement *)element usingThisDictionary:(NSMutableDictionary **) map {
    // search for each element...
    if (someError) return NO;

    [*map setObject: [TBXML attributeValue:attribute] forKey:[TBXML elementName:element]];

    return YES;
}
@end

ОБНОВЛЕННЫЙ: Спасибо парни (IwasRobbed, Simon, TechZen)

Я отлаживал и изменял код... Я нашел что: для поддержания имени имени и значения идентификатора, я должен сделать:

name =[[self getParam:@"nameResponse"] copy];
id =[[self getParam:@"myId"] copy];

вопросы: Q1. разговор о старом коде (whitout copy), name и id значение выпущено потому что

1) это выслежено к paramIn словарь, и paramId выпущен?

ИЛИ

2) оба значения копируются с paramIn словарь, но существует, не сохраняют/копируют инструкцию

Я думал, ответ 2), правильно?

Q2. как я могу сохранить значения, сохраненные в NSMutableDictionaries paramIn и paramOut ?

спасибо

1
задан jhon 29 July 2010 в 17:59
поделиться

2 ответа

Если вы не разместили или не сохранили рассматриваемый объект (строку?), И он был передан вам другим методом, он, вероятно, автоматически выпущен. Насколько я понимаю, объект сохраняется только до тех пор, пока не будет выпущен пул автозапуска (в конце текущего цикла выполнения?). Это вызовет вызовы send: и receive: в одном и том же цикле (при вызове их в одной функции), но при вызове по отдельности вызовет ошибку, поскольку объект имеет были выпущены автоматически.

1
ответ дан 2 September 2019 в 22:40
поделиться

Ваши переменные экземпляра name, in и out не определены как свойства, поэтому вы должны микроконтролировать их сохранение. Если этого не сделать, то они не выживут долго за пределами метода, в котором вы их задали.

Самое простое решение - сделать свойства переменных экземпляра следующим образом:

@property(nonatomic, retain)  NSString *name;
@property(nonatomic, retain)  NSMutableDictionary *in;
@property(nonatomic, retain)  NSMutableDictionary *out;

... и затем использовать нотацию self, например, self.name для доступа к ним.

1
ответ дан 2 September 2019 в 22:40
поделиться