проблемы с передачей объекта - PullRequest
0 голосов
/ 21 сентября 2011

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

CrestronControllerValues ​​это просто класс получения и установки

я инициализирую и передаю его моему делегату приложения:

NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

NSArray *keys = [NSArray arrayWithObjects:@"IPaddress", @"PortNumber", nil];

NSArray *objs = [NSArray arrayWithObjects:@"10.8.30.111", @"41794", nil];

NSDictionary *dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];

[defaults registerDefaults:dict];



CrestronControllerValues *CCV = [[[CrestronControllerValues alloc]init]autorelease];
[CCV setIPID:3];
[CCV setIPaddress:[defaults stringForKey:@"IPaddress"]];
[CCV setPortNumber:[defaults stringForKey:@"PortNumber"]];

cClient = [[CrestronClient alloc] initWithCCV:CCV];

как видите, последняя строка передает его другому классу это где моя проблема вступает в игру если я пытаюсь использовать getipaddress или getportnumber, я получаю плохой доступ

- (id)initWithCCV:(CrestronControllerValues *)ccv
{
    [super init];

    CCV = [CrestronControllerValues alloc];
    CCV = ccv;

    port = [[ccv getPortNumber] intValue];
    ip = [ccv getIPaddress];

    NSLog(@"ip %@ ~ port %@", ip, port);

    return self;
}

Я пробовал несколько способов, в том числе cClient.ccv = ccv (в отличие от отправки его с помощью init) попытался добавить геттер для себя, чтобы он был cClient = [[CrestronClient alloc] initWithCCV: [CCV getSelf]];

Ответы [ 4 ]

2 голосов
/ 21 сентября 2011

Правильный способ хранения объектов в NSUserdefaults - [defaults synchronize].Вы получаете плохой доступ, потому что объекты, которые вы получаете из значений по умолчанию: nil.

Проверка Ссылка на класс NSUserDefaults

2 голосов
/ 21 сентября 2011

Учитывая, что CCV в вашем последнем фрагменте кода является иваром, попробуйте вместо этого:

CCV = [ccv retain];

Вам не нужно выделять место для существующего объекта. Кроме того, будьте осторожны с вашим шаблоном метода init, вы можете взглянуть на документацию .

0 голосов
/ 21 сентября 2011

вот результирующий код, который работает:

- (id)initWithCCV:(CrestronControllerValues *)ccv
{
    self = [super init];
    if (self) 
    {
    socket = [[LXSocket alloc] init];

    [DDLog addLogger:[DDASLLogger sharedInstance]];
    [DDLog addLogger:[DDTTYLogger sharedInstance]];
    sqliteLogger = [[FMDBLogger alloc] initWithLogDirectory:[self applicationFilesDirectory]];

    sqliteLogger.saveThreshold     = 500;
    sqliteLogger.saveInterval      = 60;               // 60 seconds
    sqliteLogger.maxAge            = 60 * 60 * 24 * 7; //  7 days
    sqliteLogger.deleteInterval    = 60 * 5;           //  5 minutes
    sqliteLogger.deleteOnEverySave = NO;

    [DDLog addLogger:sqliteLogger];

   // CCV = [CrestronControllerValues alloc];
    CCV = [ccv retain];
    port = [CCV getPortNumber];
    ip = [CCV getIPaddress];

    NSLog(@"ip %@ ~ port %@", ip, port );
    }
    return self;
}

и метод отправителя:

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
{
    // Override point for customization after application launch.
    [self.window makeKeyAndVisible];

    [ConnectCommand addTarget:self action:@selector(command1ButtonPressed) 
       forControlEvents:UIControlEventTouchUpInside];
    [SendJoin addTarget:self action:@selector(command3ButtonPressed) 
       forControlEvents:UIControlEventTouchUpInside];
    [UpdateLog addTarget:self action:@selector(updateLogButtonPressed) 
        forControlEvents:UIControlEventTouchUpInside];



    NSUserDefaults *defaults = [NSUserDefaults standardUserDefaults];

    NSArray *keys = [NSArray arrayWithObjects:@"IPaddress", @"PortNumber", nil];

    NSArray *objs = [NSArray arrayWithObjects:@"10.8.30.111", @"41794", nil];

    NSDictionary *dict = [NSDictionary dictionaryWithObjects:objs forKeys:keys];

    [defaults registerDefaults:dict];


    CrestronControllerValues *CCV = [[CrestronControllerValues alloc]init];
    [CCV setIPID:3];
    [CCV setIPaddress:[defaults stringForKey:@"IPaddress"]];
    [CCV setPortNumber:[defaults stringForKey:@"PortNumber"]];

   // NSLog(@"ip from defaults %@   ~ ip from ccv %@",[defaults stringForKey:@"IPaddress"], [CCV getIPaddress] );


    cClient = [[CrestronClient alloc] initWithCCV:CCV];

    [CCV release];

    return YES;
}

другая часть проблемы заключалась в том, что порт был и попытка передать ему строку вызывает сбой но это [ccv retain] должно быть там

0 голосов
/ 21 сентября 2011

Были ли синтезированы IP-адрес и номер порта? Если вы хотите получить доступ к этим переменным из другого класса, вам необходимо убедиться, что в CrestronControllerValues.h вы объявляете @property для каждого объекта, а в CrestronControllerValues.m вы @synthesize IPaddress, PortNumber, если явно не указано иное объявляя ваши методы получения и установки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...