Свойства Objective C другого класса, чтобы быть доступными в других методах - PullRequest
1 голос
/ 25 октября 2019

Здравствуйте, люди, которых я знаю, что этот вопрос задавался много раз на этом форуме. После просмотра этих сообщений я нашел частичное решение проблемы в одном из постов, но у меня есть одно сомнение в этом посте. Objective-C: доступ к свойству другого класса .

Мне удалось получить доступ к значениям свойств по данному ответу, но я не смог использовать те же значения этих свойствв других экземплярах методов дочернего класса. Кто-нибудь может привести несколько примеров того, как сделать то же самое.

PS: я понимаю, что это очень простая вещь, чтобы спросить о другом посте, так как мне не хватаетрепутация, чтобы прокомментировать то же самое, что я придумал с этим вопросом, пожалуйста, помогите мне с этим, поскольку я ударил в этом за последние 3 дня, любая помощь будет принята с благодарностью.

Спасибо

обновление кода

@interface ClassA : SomeSuperClass

@property (some Attributes) ClassB *classB;
@property (some Attributes) NSString *someString;

@end


@implementation

-(id)init {
    if (self = [super init]) {
        _classB = [[ClassB alloc]initWithParent:self];
    }
}

@end

@class ClassA;
@interface ClassB : SomeSuperClass

@property (nonatomic, weak) ClassA *classA;

-(id)initWithParent:(ClassA*)parent;

@end

#import "ClassA.h"
@implementation 
-(void)viewDidLoad{
    NSLog(@"%@",self.classA.someString); //here I get null
}
-(id)initWithParent:(ClassA*)parent {
    if (self = [super init]) {
        _classA = parent;
        NSLog(@"%@", self.classA.someString); //perfectly legal and prints the string value
    }
}

Ответы [ 3 ]

1 голос
/ 30 октября 2019

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

Пример:

+(id)singletonInstance
{
  static classA *classA = nil;
  static dispatch_oce_t onceToken;
  dispatch_once(&onceToken, ^{
  // if the instance is not there then create an instance and init one.
  classA = [[self alloc] init];
  });
  return classA;
}


// in the same class .m file viewDidLoad add the below code

//classA.m

classA *classA = [classA sharedInstance]; // this will be the instance which will be called by other classes (i.e classB ..etc).

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

1 голос
/ 25 октября 2019

Измените

@property (nonatomic, weak) ClassA *classA;

на

@property (nonatomic, strong) ClassA *classA;

Причина, по которой вы получаете ноль, заключается в том, что объект ClassA освобожден. Он освобожден, потому что ваша слабая ссылка не сохраняет его. Только сильные ссылки сохраняют объекты. Читайте о ARC.

Измените реализацию ClassA на следующую:

@interface ClassA : SomeSuperClass

@property (some Attributes) ClassB *classB;
@property (some Attributes) NSString *someString;

@end


@implementation

-(id)init {
if (self = [super init]) {
    _classB = [[ClassB alloc]initWithParent:self];
}
}

- (void)dealloc
{
    // do you see this printed in console when you run the app?
    NSLog(@"DEALLOC!!!");
}

@end
0 голосов
/ 26 октября 2019

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

Я предполагаю, что SomeSuperClass, вероятно, наследуется от UIViewController

1. Инициализация не возвращает объект экземпляра

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

- (instancetype)init{
    if (self = [super init]) {
        _classB = [[ClassB alloc]initWithParent:self];
    }
    return self;
}

2. weak свойство модификатора

Как правило, только weak используется для решения циклических ссылок. Этого следует избегать в другое время и он будет выпущен сразу после использования.

3. someString свойство не видит инициализацию

4. Порядок, в котором ClassA и ClassB вводят

Я предполагаю, что вы решили предыдущую проблему, и необходимо сначала ввести ClassA, затем ввести ClassB.

Чтобы ввести ClassB из ClassA, вы должны использовать инициализированное свойство classB, например,

ClassA.m

[self.navigationController pushViewController:self.classB animated:YES];

Затем, наконец, выполнить viewDidLoad при отображении ClassB, вы можете получить правильныйsomeString

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