Доступ к Методу от другого Objective C Классов

Ни один из кандидатов, у которых мы, никогда взяли интервью не спрашивал это; однако, многие из них были co-ops/interns в компании, таким образом, они знакомы с нашим кодом...

Однако очень маловероятно, что мы покажем наш код ЛЮБОМУ кандидату, независимо от NDA. Я был бы рад ответить на вопросы о том, какие технологии мы используем, какую систему мы используем для изменений, методов вокруг, и т.д. Фактический код, хотя? Нет.

Также в достаточно большой системе (поскольку наш) кто-то может просто показать Вам "лучший" код, там..., и Вы были бы то, где Вы запустили:) Что касается проектирования баз данных... обе компании, в которых я работал, имели чрезвычайно большие базы данных (университет, корпоративная компания)... так, чтобы не работал бы также.

19
задан Ethan Mick 1 November 2009 в 21:40
поделиться

6 ответов

Option 1:

@implementation commonClass
+ (void)CommonMethod:(id)sender  /* note the + sign */
{
//So some awesome generic stuff...
    }
@end

@implementation ViewController2

- (void)do_something... {
    [commonClass CommonMethod];
}


@end

Option 2:

@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
    }
@end

@implementation ViewController2

- (void)do_something... {
    commonClass *c=[[commonClass alloc] init];
    [c CommonMethod];
    [c release];
}

@end

Option 3: use inheritance (see Mr. Totland's description in this thread)

@implementation commonClass
- (void)CommonMethod:(id)sender
{
//So some awesome generic stuff...
    }
@end

/* in your .h file */
@interface ViewController2: commonClass

@end

naturally you always need to #import commonClass.h in your view controllers..

26
ответ дан 30 November 2019 в 03:20
поделиться

Здесь есть несколько ответов, в которых вам предлагается создать общий «родительский» класс. Однако я думаю, что вы можете добиться большего. Вместо этого создайте категорию для UIViewController. Вы не знаете всего, что происходит с UIViewController, поэтому я не думаю, что стоит создавать свою собственную иерархию контроллеров представления. На самом деле это могло быть опасно. Я столкнулся с рядом проблем, когда попытался создать «базовый» UITableViewController, а затем создать классы, наследующие от него. Я избежал этих проблем, используя вместо этого категории.

Ваш приоритет №1 не должен наследовать вещи без уважительной причины, это должно быть приложение в магазине приложений, которое люди захотят скачать.

6
ответ дан 30 November 2019 в 03:20
поделиться

Мне кажется, что общий код не обязательно должен быть в классе. Есть ли причина, по которой вы не можете просто использовать функцию в стиле C для того, что хотите делать?

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

Другой вариант - написать метод класса вместо методов экземпляра для этого общего кода. Я думаю, что большинство людей считают, что синглтонов лучше избегать в качестве варианта дизайна.

Было бы легче дать хороший ответ, если бы мы знали больше о том, чего вы действительно пытались достичь.

3
ответ дан 30 November 2019 в 03:20
поделиться

Что вы хотите сделать, так это сделать так, чтобы два контроллера совместно использовали общий суперкласс:

UIViewController : MyAwesomeViewController : ViewController1
                                           : ViewController2

commonMethod: затем будет находиться в MyAwesomeViewController. Также не начинайте имена методов с заглавных букв. :)

Чтобы уточнить:

+@interface MyAwesomeController : UIViewController {

-@interface ViewController1 : UIViewController { // and ditto for ViewController2
+@interface ViewController1 : MyAwesomeController {
3
ответ дан 30 November 2019 в 03:20
поделиться

Имейте в виду, что Objective-C - это просто надмножество C, а директивы #include являются в основном используется для файлов заголовков, ничто не мешает вам использовать #include для встраивания содержимого одной реализации в другую. Если код действительно идентичен, вы легко можете просто вставить его в отдельный файл и # включить в файл .m.

Сказав это, возможно, было бы лучше использовать эту технику в сочетании с категориями, особенно если одна и та же реализация имеет аналогичное поведение.

1
ответ дан 30 November 2019 в 03:20
поделиться

Pass in a reference to your commonClass when you alloc and init your views...

CommonClass *cc = [[CommonClass alloc] init];

ViewController1 *vc1 = [[ViewController1 alloc] ... initWith:cc];
ViewController2 *vc2 = [[ViewController2 alloc] ... initWith:cc];

but making a classic c include might suffice.

1
ответ дан 30 November 2019 в 03:20
поделиться