Как я могу привести СУХОЙ (не повторяйся) к Objective-C - PullRequest
5 голосов
/ 01 августа 2009

Я перехожу из Ruby в Objective-C и продолжаю делать:

NSObject *foo;

@property (nonatomic,retain) NSObject *foo;

в файле .h, а затем в файле .m:

@synthesize foo;

вверху и

[foo release]

в dealloc.

Это 4 шага, чтобы добавить foo! Делают ли опытные программисты Objective-C все четыре шага вручную каждый раз, когда хотят добавить новую переменную экземпляра в класс? Мне не хватает способа сделать этот СУХОЙ?

Ответы [ 6 ]

6 голосов
/ 01 августа 2009

Это обычная проблема и в C ++ (удвоение объявлений, хотя, правда, немного другое). Короткий ответ: так устроен язык. На самом деле это не идет вразрез с DRY, поскольку каждое утверждение уникально и имеет свою цель. Однако по общему признанию это очень многословно по сегодняшним стандартам.

3 голосов
/ 27 сентября 2010

Эта страница http://pragprog.com/magazines/2010-07/not-quite-new-in-ios- утверждает, что вы можете отбросить объявление переменной, уменьшив его только до 2 повторов:)

#import <UIKit/UIKit.h>
@interface MoveMeViewController : UIViewController {
}

@property(nonatomic, retain) IBOutlet UIImageView *imageView;
@end
1 голос
/ 01 августа 2009

Поскольку вы упомянули, что вы новичок в Objective-C, я хочу убедиться, что вы знаете, что вам не нужно создавать свойства для каждой переменной экземпляра в ваших классах, и на самом деле вам, вероятно, не следует ,

Свойства представляют интерфейс, предоставляемый вашим классом для других классов. Этот интерфейс не обязательно совпадает с внутренней реализацией класса. В тех случаях, когда они совпадают, объявленный синтаксис свойств позволяет (относительно) просто выразить это.

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

0 голосов
/ 01 августа 2009

Вы сможете обойти необходимость объявления как переменной экземпляра, так и свойства, когда 32-разрядные компьютеры будут забыты, поскольку 64-разрядная среда выполнения может синтезировать переменные экземпляра. Но вы не можете быть полностью СУХИМ на языке, где вещи должны быть объявлены в заголовочном файле и реализованы на другом Язык требует дублирования. Единственный выход - создать метаязык.

Вы можете использовать сценарии, чтобы исключить дублирование набора одной и той же переменной снова и снова, но она все равно будет присутствовать в коде.

Кстати, я не думаю, что заявление @synthesize является дублирующей информацией. Ничто в вашем коде не указывает, какие средства доступа используются для получения собственности.

0 голосов
/ 01 августа 2009

Да, но я надеюсь, что каждый день кто-нибудь придумывает сценарий или что-то для XCode, чтобы автоматизировать процесс. (Я тоже предпочитаю

self.foo = nil 

в моих делах)

0 голосов
/ 01 августа 2009

Objective-C - это очень тонкий слой поверх C. На низком уровне большая часть "Objective" компилируется в указатели кода, которые вводятся в процесс компиляции C.

Они добавили подсчет ссылок (самая базовая система сбора мусора), но по своей природе все это делается вручную, отсюда и вызовы "Release".

В версиях, отличных от iPhone, добавлена ​​настоящая система сбора мусора, но они также не уменьшаются, поскольку освобождение не столь детерминировано.

Держите ваши объекты маленькими и сфокусированными, а синтаксис свойства не должен быть слишком инвазивным.

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