Pull to refresh

Comments 106

> в Objective-C все методы public (точнее говоря, в нем вообще нет разделения методов по уровням доступа).

А как же @private, @protected, @public?
Это касается ТОЛЬКО полей класса, но не методов.

Обычно, чтобы определить private-методы делают категорию, которую определяют в .m-файле, а не .h.

Например: macdevelopertips.com/objective-c/private-methods.html
Дополню. Спрятать методы можно только на уровне интерфейса. Практически же, можно послать любое сообщение объекту с помощью performSelector: и если у него есть соответствующий метод (можно проверить с помощью respondsToSelector:), то он будет выполнен. Больше того: с помощью runtime можно узнать, какие есть свойства и методы у объекта и обращаться к ним.
… а также подменять реализации методов и делать многие другие фокусы, свойственные в основном скриптовым языкам
Это относится только к переменным экземпляра класса.
Метод можно только попытаться спрятать, убрав из .h файла.
Далее его можно вообще не декларировать, а можно задекларировать в категории к классу в .m файле.
Спасиоб за статью!
Вопрос по использованию памяти: если мы делаем release какому-то объекту, содержащему ссылки на другие объекты, будет ли автоматически сделан release для этих ссылок внутри него?
Нет. Вы должны это сами сделать в методе -(void)dealloc класса.
да и не забывайте про [super dealloc]
т.е. должно выглядеть так

-(void) dealloc{
//release для объектов, на которые ссылаемся
[super dealloc];
}
Еще нужно отметить, что dealloc вызывается не сразу, когда счетчик ссылок становится равен нулю, а, в общем случае, по завершении текущего RunLoopCycle.

Так же стоит упомянуть, что в 99,9% случаев вызов dealloc руками не нужен, кроме [super dealloc]. 0.1% оставил на случай если я чего-то не знаю, но пример, когда нужно вызывать его самому придумать не могу.
Есть подозрение, что Вы путаете освобождение памяти для autorelese объектов.
Можете поделиться ссылкой, где бы было написано о вызове dealloc по завершении текущего RunLoopCycle, интересно же.
Да, сейчас посмотрел — и правда перепутал. dealloc, по всей видимости вызывается как только retainCount == 0. Виноват.
UFO just landed and posted this here
>программа, написанная на C, является программой на Objective-C, что не всегда верно, например, для С++).

Какой же это объектно ориентированный язык если программа написанная на С является программой на Objective C?

Оно скомпилится просто. Чтобы написать программу для iPhone в любом случае понадобится cocoa-touch «прослойка».
Такой вопрос: при первом знакомстве с Objective C, как .NET разработчик, Вы скорее всего смотрели в сторону MonoTouch (лично со мной было бы, именно так). Расскажите, почему всё-таки решили писать на чистом Objective C?
Все эти молодые фреймворки очень сырые.
Вам придется или вылавливать в них баги, или бороться с ограничениями, которые они накладывают.

И для небольших приложений (под iPhone) это дает небольшой выигрыш.
Вот ради XNATouch можно постараться — это хороший мощный фреймворк, а MonoTouch — просто обертка. Радикально новой функциональности он не приносит.
нет, не смотрел на MonoTouch. во-первых, я всегда считал и продолжаю считать, что всегда лучше пользоваться нативными средствами разработками. во-вторых, было как раз время запрета Apple на разработку приложений ненативными средствами.
на MonoTouch смотрю сейчас, но вовсе не из-за того, что я .Net разработчик:) меня привлекает идея писать приложения сразу под несколько устройств (или очень быстро переносить написанный код с одной платформы на другую) — iPhone, Windows Phone 7 (в будущем, думаю, и Android).
Купила бы Apple лицензию на C# у Microsoft и всего делов.
очевидно чтобы автору предыдущего поста было хорошо, больше незачем

или как в анекдоте
— ща в ухо дам!
— зачем?
— за шкафом!
Видимо, автор комментария очень хочет остаться плотником «который пока работал только с одним видом дерева» (с) :)
UFO just landed and posted this here
Он такой же объектный язык как Java и C#. Нет, правда. Квадратные скобки пугают до поры до времени. Потом привыкаешь и пишешь без проблем вообще.
UFO just landed and posted this here
UFO just landed and posted this here
третий пункт можете сразу вычеркнуть
начиная с версии iOS 4.0 добавлены т.н. блоки, которые как раз представляют из себя лямбды, плюс все прелести замыкания и т.п.
более детально здесь и здесь
UFO just landed and posted this here
Лямбды в C# — это еще и Expression Trees. Совершенно убийственный инструмент в умелых руках.
1й пункт не очень понимаю, честно говоря.

Я на objc могу написать примерно следующее:
for ( NSObject *x in something ) {
    [x performSelector:@selector(bla-bla-bla:) withObject:mu-ha-ha];
}


Как уже упомянули выше, мы объекту можем послать любое сообщение и, если у него прописан обработчик этого сообщения, объект ответит.

Может я не так понял — поясните?
UFO just landed and posted this here
UFO just landed and posted this here
Первое — субъективно. Второе — объективно, но не показатель удобства. Brainfuck тоже моложе Objective-c.
насчет удобства — субъективная оценка
да и вообще, «удобство» языка это что?
более уместно тут сравнивать IDE для разработки на C# и Objective-C, но это уже совершенно другая тема
UFO just landed and posted this here
не самый удачный пример
в этом случае вообще нет необходимости использовать специфику objective-c, и можно обойтись чем-то вроде
// C
int sum = 0, seq[] = {1, 2, 3, 4, 5};
for (int i = 0; i < sizeof(seq) / sizeof(seq[0]); i++) sum += seq[i] * seq[i];


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

человеку, который годами писал на С, тоже достаточно долго придется втолковывать почему такой непривычный и не понятный для него синтаксис F#, на самом деле лаконичнее и понятнее
UFO just landed and posted this here
Как раз-таки этот пример удачный. То, что вы написали, во-первых, это 4 строки вместо двух, во-вторых, тут сначала приходится думать о том, каким образом пройтись по массиву и куда сложить результаты, а уж потом, как мне работать с этими данными из массива. С этой точки зрения линкью просто прекрасен. То, что по другому умещалось бы, как минимум в одной строке, с помощью Linq занимает всего один вызов нужного экстеншен метода в общей цепочке.
А почему вы понятность меряете строчками? Те 4 строки можно превратить хоть в одну, наворотив макросов.
Я не мерил понятность строчками? Понятность (в данном случае легкость написания) я мерил абстрактностью над итерацией. Программист думает не над тем, каким образом ему данные «обойти», что, по сути, является чисто рутинной операцией, а о том, что с этими данными ему нужно сделать при «обхождении».

Количество строк — это побочное свойство, отчасти оно вытекает из того же, что я написал и выше. Каждая подготовительная строка символизирует очередную рутинную операцию, которая необходима для того, что бы подготовить данные для обработки. И лишь в самом конце кода, который занимает 20-30%, у вас написана сама суть программы. Вот что я называю понятностью, хотя лучше было бы выразить это лаконичностью.
На ObjC этот код будет выглядеть намного проще, кстати — или что вы хотели им сказать?

IMHO, нет уже такого понятия, как «удобство языка», по одной простой причине: уже давно никто ничего не пишет на герметизированном сферическом языке в вакууме.

Пишут с использованием библиотек, фреймворков, паттернов, навязываемых (в хорошем смысле) этими самыми фреймворками. Нет никакой разницы, как написать: button = [[UIButton buttonWithTitle:@«hello»] или button = CButton.buttonWithTitle(«hello»), по большому счету.

Конечно, я не учитываю пограничные случаи типа brainfuck vs C#.

UFO just landed and posted this here
Я понял, у вас простота = «все написать в одну строчку».
UFO just landed and posted this here
NSArray* array = // ... ;
__block sum = 0;
[array enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        m = [obj intValue];
        sum += m*m;
}];

UFO just landed and posted this here
А чем вот это: «var sqrSum = ( from x in seq select x*x ).Aggregate(0, (acc, x) => acc + x);» проще?

Ваш пример больше похож на regexp — да, лаконично, да — в одну строчечку, да — можно выпендриться перед собеседуемым, но если разбирать модуль в 10000 строк, написанный таким образом — да вы первый застрелитесь.
UFO just landed and posted this here
Модифицируйте свой пример так, чтобы квадраты четных чисел суммировались отдельно от нечетных и чтобы если одна из сумм превышает 99, мы выпадали из функции (return -1).
UFO just landed and posted this here
UFO just landed and posted this here
Что и требовалось доказать: как только мы отошли от сферического цикла в вакууме, пришлось отказаться от такого замечательного LINQ.
UFO just landed and posted this here
> Ваша задача, это и есть сферический конь в вакууме, не имеющий ни малейшего отношения к практике.

Самая обычная задача — пробежаться по циклу и что-нибудь сделать с элементами (возможно, не со всеми). Как только логика чуть-чуть изменилась — все, LINQ поднял лапки, начались намеки на костыли и проч.

Это очень похоже на binding, реализацию MVC на «большом» Cocoa — все красиво выглядит в примерах, какие-то вещи можно писать вообще не написав ни строчки С-шного кода, но когда пытаешься вытащить это в реальный мир, вся красота разваливается из-за ограничений фреймворка.

Т.е. получается так, что простые вещи делать еще проще, а сложные — еще сложнее.
UFO just landed and posted this here
> Просто эта задача проще и более интуитивно решается обычной итерацией.

Покажите сложную задачу, которая решается проще с использованием LINQ.
UFO just landed and posted this here
Покажите хоть один такой случай. Не в виде общих пространных рассуждений, а куском кода.
UFO just landed and posted this here
Спустя два года… :)

На самом деле, описанный выше через жопу (простите) пример правильно закодить следующим элементарным LINQ запросом:

var sqrSum = seq.Sum(x => x*x);

Проще? :)
Да и у вас не самый читабельный код с LINQ-вставкой;

var sqrSum = seq.Aggregate(0, (acc, x) => acc + x*x );


так не проще?
UFO just landed and posted this here
UFO just landed and posted this here
UFO just landed and posted this here
Я пишу и на Java и на C# и на Objective C.
И как ни странно писать на Objective C мне приятнее. Хотя согласен что она сильно отличается от всего остального и тем более намного многословнее чем Java и C#.
Она как бы более понятна мне, что ли?!
нравится. сначала, конечно, было очень непривычно. но потом втянулся. определенный шарм у Objective-C есть.
синтаксис жесткий, конечно… немудрено, что глаза выпадают
Цель Objective-C — быть максимально схожим с английским языком. Т.е:

-(id)initWithFirstDigit:(NSNumber*)firstDigit andSecondDigit:(NSNumber*)secondDigit;

читается как английское предложение «Init with first digit (firstDigit) and second digit (second digit).»
читалось бы, если бы не вырвиглазные скобки, звездочки и двоеточия, тире и т.д.
приходится цитировать свой же коммент из похожего спора в другом топике
там была такая фраза
Когда здоровый программист впервые видит вызовы методов в Objective C — у него выпадают глаза.

многое зависит от того, как писать
даже на C#, F# можно писать так, что поймет только автор и никто больше, а вот как можно перефразировать цитату сверху на ObjC:
if ([здоровыйПрограммист видитВпервые:objectiveC.вызовМетода]) {
    [здоровыйПрограммист.глаза выпадают];
}

так что повторюсь, язык очень и очень читабельный, и даже воспитывает в разработчике определенную культуру кода
а еще понятнее он становится, если перестать судить о нем с колокольни, например, С#, и взамен посвятить его изучению примерно пол часа в день, в течении 2-х недель
всю неприязнь и все неудобства как рукой снимет
Никак не могу понять, что здесь написано. firstDigit & andSecondDigit — это имена передаваемых переменных?
в данном случае это объявление метода, название метода разрывается аргументами, которые должны идти после двоеточия.
Вызов этого метода (точнее отправка сообщения) будет выглядеть как то так:
[someObj initWithFirstDigit:firstArgument andSecondDigit:secondArgument]
Селектором метода (сам метод грубо говоря) является
initWithFirstDigit:andSecondDigit:

Аргументами являются firstDigit и secondDigit
Просто я не могу понять, слово and в начале переменной — это часть стиля программирования (т.е. пишу и называю переменные, как будто пишу предложение) или это часть языка, где приставка and разделяет переменные?
Просто в первом случае схожесть с английским языком — это заслуга программиста, а не языка.
Слово and, конечно, не является частью синтаксиса языка. Хотите пишите, не хотите — не надо.
Схожесть с английским в Objective-C заключается в формулировке названий методов, не «название(аргументы, через, запятую)» как в C++, whatever, а «Описание: аргумент описание2: аргумент» и т.д.
Ну, название метода, это и есть его краткое описание (получаю то-то, делаю то-то), тоже самое и с аргументами. Так что, по моему, это не оправдывает этот, весьма странный, синтаксис. К тому же, все эти скобочки, пробелы вместо точек, куча еще символов для бог знает чего, отнюдь не похоже на английский язык.
это часть стиля программирования.
В этом топике несколько раз встречается утверждение, что цель — максимальная схожесть с английским. Это глупость. Цель — скрещивание си со смолтолком. Получилось, надо сказать, довольно эклектично. Что же до «максимальной похожести на английский» — не вижу ничего хорошего. Вот «hello, world» на языке, который ДЕЙСТВИТЕЛЬНО проектировался с целью быть максимально похожим на английский:
The Infamous Hello World Program.

Romeo, a young man with a remarkable patience.
Juliet, a likewise young woman of remarkable grace.
Ophelia, a remarkable woman much in dispute with Hamlet.
Hamlet, the flatterer of Andersen Insulting A/S.


                    Act I: Hamlet's insults and flattery.

                    Scene I: The insulting of Romeo.

[Enter Hamlet and Romeo]

Hamlet:
 You lying stupid fatherless big smelly half-witted coward!
 You are as stupid as the difference between a handsome rich brave
 hero and thyself! Speak your mind!

 You are as brave as the sum of your fat little stuffed misused dusty
 old rotten codpiece and a beautiful fair warm peaceful sunny summer's
 day. You are as healthy as the difference between the sum of the
 sweetest reddest rose and my father and yourself! Speak your mind!

 You are as cowardly as the sum of yourself and the difference
 between a big mighty proud kingdom and a horse. Speak your mind.

 Speak your mind!

[Exit Romeo]

                    Scene II: The praising of Juliet.

[Enter Juliet]

Hamlet:
 Thou art as sweet as the sum of the sum of Romeo and his horse and his
 black cat! Speak thy mind!

[Exit Juliet]

                    Scene III: The praising of Ophelia.

[Enter Ophelia]

Hamlet:
 Thou art as lovely as the product of a large rural town and my amazing
 bottomless embroidered purse. Speak thy mind!

 Thou art as loving as the product of the bluest clearest sweetest sky
 and the sum of a squirrel and a white horse. Thou art as beautiful as
 the difference between Juliet and thyself. Speak thy mind!

[Exeunt Ophelia and Hamlet]


                    Act II: Behind Hamlet's back.

                    Scene I: Romeo and Juliet's conversation.

[Enter Romeo and Juliet]

Romeo:
 Speak your mind. You are as worried as the sum of yourself and the
 difference between my small smooth hamster and my nose. Speak your
 mind!

Juliet:
 Speak YOUR mind! You are as bad as Hamlet! You are as small as the
 difference between the square of the difference between my little pony
 and your big hairy hound and the cube of your sorry little
 codpiece. Speak your mind!

[Exit Romeo]

                    Scene II: Juliet and Ophelia's conversation.

[Enter Ophelia]

Juliet:
 Thou art as good as the quotient between Romeo and the sum of a small
 furry animal and a leech. Speak your mind!

Ophelia:
 Thou art as disgusting as the quotient between Romeo and twice the
 difference between a mistletoe and an oozing infected blister! Speak
 your mind!

[Exeunt]
Но при этом очень логичный. Выражения напоминают выражения на естественном языке, что повышает читаемость кода.

И опять же, Обджектив-Си далеко в этом деле до Хаскелля, например :) Даже со скидкой на другую парадигму.
UFO just landed and posted this here
Это если изрядно его теребить.
А если вот так, внезапно, посмотреть нетренированным взглядом — богатство синтаксиса может свести с ума :)
UFO just landed and posted this here
Согласен. Но шок-эффект для бывших С-программистов — безусловно выше.
Собственно, в Objective-C тоже допускается использование конструкции
[SomeObject new]

Это эквивалентно конструкции
[[SomeObject alloc] init]

Однако годится для т.н. «не перекрытого» создания (инициализации) объектов.
Т.е., +alloc/-init вызываются безусловно, без возможности передачи неких ваших данных в вызываемый объект в момент инициализации.
Пруфлинк: NSObject Reference
именно это в статье и написано, только другими словами. хотя, пожалуй, на этом действительно нужно было сделать более сильный акцент.
Да, а теперь если прикинуть, сколько сотен тысяч разработчиков Apple нагнул на Objective-C, становится просто жутко…

Интересно, есть ли профсоюзы для программистов?
Да, а теперь если прикинуть, сколько сотен тысяч разработчиков Microsoft нагнул на C++, становится просто жутко…

Интересно, есть ли профсоюзы для программистов?
Точнее, на С++, на VB, на C#, на F#, на M…

Так и широкие мышцы спины можно прокачать нагибаясь-разгибаясь :)
[someString isEndedWithString:anotherString withIgnoreCase:YES andCultureInfo:someCulture];

[[someString getSubstringStartedAtIndex:1] isEndedWith:[anotherString Trim] withIgnoreCase:YES andCultureInfo:[CultureInfo getCurrentCulture]];

-(int)sumOfFirstNumber:(int)firstNumber andSecondNumber:(int)secondNumber;

Сделайте мне это развидеть. Теперь понятно что разработчикам платят так много — за мазахизм.
Это многократно лучше, чем N шаблонов C++, да сдобренные приведением типов, да щедро обмазанные гораздо менее наглядным менеджментом памяти :) И вполне читабельно, хоть и густовато.
Так разве кто против, это нужная фича, веть как реализовано просто:

Console.WriteLine(CalculateBMI(weight: 123, height: 64));

А теперь посмотрите на код objective-c.

Цель Objective-C — быть максимально схожим с английским языком.

Процедура ЗагрузкаИзТХТФайла()
Спр=СоздатьОбъект(«Справочник.Номенклатура»);
ИМФ=«D:\номенклатура.txt»;
Док=СоздатьОбъект(«Текст»);
Док.Открыть(ИМФ);
Если Док.КоличествоСтрок()=0 Тогда
Предупреждение(«Загружаемый справочник пустой!»);
Возврат;
КонецЕсли;
Для я=1 по Док.КоличествоСтрок() Цикл
Стр=Док.ПолучитьСтроку(я);
Эл=Лев(стр,1);
Если Эл=«0» Тогда
Спр.ИспользоватьРодителя(0);
Спр.НоваяГруппа();
Спр.Наименование=Сред(стр,3);
Спр.Записать();
ЭтаГр=Спр.ТекущийЭлемент();
Спр.ИспользоватьРодителя(ЭтаГР);
иначе
Спр.Новый();
Спр.ИспользоватьРодителя(ЭтаГР);
Спр.Наименование=Лев(стр,10);
Спр.Записать();
КонецЕсли;
КонецЦикла;
КонецПроцедуры
а в чем проблема objective-c?
там бы выглядело [self calculateBMIwithWeight:123 andHeight:64];
я какой-то режущей глаз разницы не вижу
отлично, то что надо. Как раз хочу начать изучать Objective-C
Жутковато от таких статей становится.

Выучите ANSI C, блеать!
Как борятся с циклическими ссылками?
роняют программу с OutOfMemory? ;)
А каковы были причины перехода с создания десктопных приложений на мобильные (C# -> iPhone)?
переход был с web-приложений (ASP.NET) на мобильные (iPhone) (хотя и десктопными я занимался, но это было уже почти два года назад). да и не переход это был, а скорее еще одно начинание — работать с .NET платформой продолжаю.
причина простая — увидели перспективу в этом рынке.
А ещё у Objective-C нет NameSpace
Ну и без Linq, Entity Framework, Generics грустно.
А в этих retain, release лишний геморой, по началу интересно вот какой я гуру всё контролирую, а потом понимаешь что это лишняя трата времени и лучше бы это всё было автоматизированно.
Скажите, апплстор принимает программы написанные на C#.Net? или все по старому? т.к. стою перед выбором, учить c# или obj-c?
да, можно писать на C#. Только учитите, что нативные средства для более-менее сложных приложений всегда лучше, чем другие инструменты. Но C# вам пригодится далеко не только в мобильной разработке. Так что зависит от ваших планов. Хотя и оба языка знать — тоже неплохо;)
инструмены — MonoTouch, Unity3D. Слышал только про эти фреймвоки, поддерживающие разработку под iOS на C#.
Спасибо за разъяснение, все же останусь на изучении обж-с.
Sign up to leave a comment.

Articles