Какао: доступ @public NSArray после обновления его из одного класса в другой - PullRequest
2 голосов
/ 04 ноября 2011

Как я могу получить доступ к @public NSArray или NSMutableArray после его обновления? Из одного класса в другой?

Я могу получить к нему доступ с помощью вызова -(id)init .. при запуске программы, но если я хочу обновить его позже, я получаю ноль. В чем проблема?

Простой пример кода:

MyFirstClass.h

#import <Foundation/Foundation.h>

@interface MyFirstClass : NSObject
{
@public

    NSArray *testArray;

}

-(IBAction)Button:(id)sender;

@end

MyFirstClass.m

#import "MyFirstClass.h"

@implementation MyFirstClass
- (id)init {
if (self = [super init]) {

    //I can take this Array from here

    //testArray = [NSArray arrayWithObjects: @"first", @"second", @"third", nil];

}
    return self;
}

-(IBAction)Button:(id)sender {

    //How take this Array?

    testArray = [NSArray arrayWithObjects: @"first", @"second", @"third", nil];

}

@end

SimpleClass.h

#import <Foundation/Foundation.h>
#import "MyFirstClass.h"

@interface SimpleClass : NSObject
{
    MyFirstClass *other;
}

-(IBAction)ButtonGet:(id)sender;

@end

SimpleClass.m

#import "SimpleClass.h"
#import "MyFirstClass.h"

@implementation SimpleClass

-(IBAction)ButtonGet:(id)sender {

    other = [[MyFirstClass alloc] init];     

    if(other->testArray) {
        NSLog(@"Working!");
    }
    else { NSLog(@"Not working!"); }

}

@end

Созданный пример имеет две кнопки в * .xib. Одна кнопка с именем «Button» (MyFirstClass) и другая «ButtonGet» (SimpleClass). Поэтому при запуске программы нужно нажать «Button», а затем «ButtonGet», после этого NSLog должен написать «Working!» если он получает testArray, а если нет - «Не работает!». Всегда отображается «Не работает!».

1 Ответ

3 голосов
/ 04 ноября 2011

Добро пожаловать в Цель C! Если вы чувствуете себя разбитым и хотите прочитать некоторые вводные материалы, просмотрите ссылки на превосходной карточке Питера Хоси «Полезные ссылки на какао / какао» .

Вы создаете экземпляр MyFirstClass в -[SimpleClass ButtonGet:], и поскольку его член testArray явно не назначен в -[MyFirstClass init], он (правильно) инициализируется равным nil. Так будет всегда, если вы не назначите ему что-то еще, но никогда не сделаете. (Вы назначаете его только в [MyFirstClass Button:], но никогда не вызываете этот метод.)

Другие вопросы для рассмотрения:

  • Ручное управление памятью требует, чтобы вы знали Правила управления памятью какао и постоянно помнили их при написании кода. Например, вам нужно сохранить результат +[NSArray arrayWithObjects:] при назначении его переменной-члену и освободить его в -[MyFirstClass dealloc]. Точно так же вам нужно освободить объект other в -[SimpleClass dealloc].

  • Гораздо понятнее использовать свойства (объявленные с использованием @property) вместо прямой ссылки на переменные-члены другого класса.

  • Пожалуйста, соблюдайте Руководство по кодированию какао и начинайте названия методов со строчной буквы. Это делает ваш код более подходящим для системных API и делает его более легким для чтения другими людьми.

...