кто выпустил мой объект в файле обработчика? - PullRequest
1 голос
/ 28 июля 2010

Я новичок в мире разработки для iphone.

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

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

@interface MyClient : NSObject {

    NSString *name;

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

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

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

- (IBAction) start: (id) sender;

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

НО ...

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

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

оба внутри * Обработчик.m

затем: метод 1) просто выполнит [myClient send];2) просто выполнит [myClient receive];

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

Iобнаружил, что данные, которые хранятся (in, out, name) при вызове [myClient send], освобождаются / уничтожаются / не существуют при вызове [myClient receive]

Я не вызывал [myClient release] иличто-то вроде этого.

вопросов: что я делаю не так?где этот код (метод 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.Говоря о старом коде (без copy), значение name и id высвобождается, потому что

1) оно привязано к словарю paramIn, а paramId освобождается?

ИЛИ

2) оба значения скопированы из paramIn dictionay, но нет инструкции сохранения / копирования

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

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

спасибо

Ответы [ 2 ]

1 голос
/ 29 июля 2010

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

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

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

... а затем используйте обозначение себя, например self.name для доступа к ним.

1 голос
/ 28 июля 2010

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

...