2010-03-22 7 views
2

У меня есть то, что я знаю, простой вопрос, но после многих поисков в книгах и в Интернете я не могу придумать решение. У меня есть стандартный проект iPhone, который содержит, помимо прочего, ViewController. На данный момент мое приложение отлично работает.Objective-C: Как получить доступ к методам в других классах

Теперь я хочу создать общий класс (расширение NSObject), который будет иметь некоторые основные методы утилиты. Назовем этот класс Util.m (вместе с ассоциированным файлом .h).

Я создаю класс Util (и .h файл) в моем проекте, и теперь я хочу получить доступ к методам, содержащимся в этом классе, из моего ViewController.

Вот пример простой версии util.h

#import <Foundation/Foundation.h> 

@interface Util : NSObject { 

} 

- (void)myMethod; 

@end 

Затем файл Util.m будет выглядеть примерно так:

#import "Util.h" 

@implementation Util 

- (void)myMethod { 
    NSLog(@"myMethod Called"); 
} 

@end 

Теперь, когда мой класс Util создан, I хотите вызвать метод myMethod из моего ViewController. В моем файле .h ViewController, я сделать следующее:

#import "Util.h" 

@interface MyViewController : UIViewController { 

    Util *utils; 

} 

@property (assign) Util *utils; 

@end 

Наконец, в ViewController.m, я делаю следующее:

#import "Util.h" 

@implementation MyViewController 

@synthesize utils; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    utils.myMethod; //this doesn't work 
    [utils myMethod]; //this doesn't work either 
    NSLog(@"utils = %@", utils); //in the console, this prints "utils = (null)" 
} 

Что я делаю неправильно? Я бы хотел не только напрямую ссылаться на другие классы/методы в простом классе util, как это, но я также хотел бы напрямую ссылаться на другие ViewControllers и их свойства и методы.

Я в тупике! Пожалуйста помоги.

ответ

5

Вы, вероятно, следуешь взглянуть на один из многих Объективных учебников C, но прямой ответ на ваш вопрос в том, что вы не выделили и инициализируетесь экземпляр объекта. Код должен выглядеть так:

utils = [[Utils alloc] init]; 
[utils myMethod]; 
+0

Спасибо. Я знал, что это простая проблема, но почему-то я думал, что @synthesize также выполнит init для меня. Очевидно, это не так. Это исправило мою проблему. Еще раз спасибо. – Adam

3

Вам просто нужно создать фактический объект.

В вашей реализации определяется только указатель на объект Util, но он по-прежнему указывает на nil.

utils = [[Util alloc] init]; 

В качестве альтернативы можно создать статические методы, заменив - путем + в префиксе метода.

[Util myMethod]; 
+0

Благодарим за ответ. Это устраняет проблему, с которой я столкнулся. – Adam

Смежные вопросы