Как решить между MonoTouch и Objective C? [закрытый]

String (byte []) обрабатывает данные как кодировку символов по умолчанию. Таким образом, способ преобразования байтов из 8-битных значений в 16-битные символы Java Unicode будет отличаться не только в разных операционных системах, но даже в разных пользователях, использующих разные кодовые страницы на одном компьютере! Этот конструктор хорош только для декодирования одного из ваших собственных текстовых файлов. Не пытайтесь преобразовывать произвольные байты в символы в Java!

Кодирование как base64 является хорошим решением. Вот как файлы отправляются через SMTP (электронная почта). (Бесплатный) проект Apache Commons Codec сделает эту работу.

byte[] bytes = loadFile(file);          
//all chars in encoded are guaranteed to be 7-bit ASCII
byte[] encoded = Base64.encodeBase64(bytes);
String printMe = new String(encoded, "US-ASCII");
System.out.println(printMe);
byte[] decoded = Base64.decodeBase64(encoded);

Кроме того, вы можете использовать Java 6 DatatypeConverter :

import java.io.*;
import java.nio.channels.*;
import javax.xml.bind.DatatypeConverter;

public class EncodeDecode {    
  public static void main(String[] args) throws Exception {
    File file = new File("/bin/ls");
    byte[] bytes = loadFile(file, new ByteArrayOutputStream()).toByteArray();
    String encoded = DatatypeConverter.printBase64Binary(bytes);
    System.out.println(encoded);
    byte[] decoded = DatatypeConverter.parseBase64Binary(encoded);
    // check
    for (int i = 0; i < bytes.length; i++) {
      assert bytes[i] == decoded[i];
    }
  }

  private static  T loadFile(File file, T out)
                                                       throws IOException {
    FileChannel in = new FileInputStream(file).getChannel();
    try {
      assert in.size() == in.transferTo(0, in.size(), Channels.newChannel(out));
      return out;
    } finally {
      in.close();
    }
  }
}

273
задан jamesaharvey 7 March 2012 в 05:08
поделиться

11 ответов

I've seen this question (and variations on it) a lot lately. What amazes me is how often people respond, but how few answer.

I have my preferences (I enjoy both stacks), but this is where most "answers" start to go wrong. It shouldn't be about what I want (or what anybody else wants).

Here's how I'd go about determining the value of MonoTouch - I can't be objective, obviously, but I think this is pretty zealotry-free:

  • Is this for fun or business? If you wanted to get into consulting in this area, you could make your $399 back very quickly.

  • Do you want to learn the platform inside-out, or do you "just" want to write apps for it?

  • Do you like .Net enough that using a different dev stack would take the fun out of it for you? Again, I like both stacks (Apple and Mono), but for me MonoTouch makes the experience that much more fun. I haven't stopped using Apple's tools, but that's mainly because I really do enjoy both stacks. I love the iPhone, and I love .Net. In that case, for me, MonoTouch was a no-brainer.

  • Do you feel comfortable working with C? I don't mean Objective-C, but C - it matters because Objective-C is C. It's a nice, fancy, friendly OO version, but if pointers give you the heebie-jeebies, MonoTouch is your friend. And don't listen to the naysayers who think you're a dev wuss if it happens that you don't like pointers (or C, etc.). I used to walk around with a copy of the IBM ROM BIOS Pocket Reference, and when I was writing assembly and forcing my computer into funny video modes and writing my own font rendering bits for them and (admittedly trashy) windowing systems, I didn't think the QuickBasic devs were wusses. I was a QuickBasic dev (in addition to the rest). Never give in to nerd machismo. If you don't like C, and if you don't like pointers, and if you want to stay as far away from manual memory management as possible (and, to be fair, it's not bad at all in ObjC), then... MonoTouch. And don't take any guff for it.

  • Would you like to target users or businesses? It doesn't matter much to me, but there are still people out there on Edge, and the fact is: you can create a far smaller download package if you use Apple's stack. I've been playing around with MonoTouch, and I have a decent little app going that, once compressed, gets down to about 2.7 MB (when submitting your app for distribution, you zip it - when apps are downloaded from the store, they're zipped - so when figuring out if your app is going to come in under the 10MB OTA limit, zip the sucker first - you WILL be pleasantly surprised with MonoTouch). But, MT happiness aside, half a meg vs. nearly three (for example) is something that might be important to you if you're targeting end users. If you're thinking of enterprise work, a few MB won't matter at all. And, just to be clear - I'm going to be submitting a MT-based app to the store soonishly, and I have no problem whatsoever with the size. Doesn't bother me at all. But if that's something that would concern you, then Apple's stack wins this one.

  • Doing any XML work? MonoTouch. Period.

  • String manipulation? Date manipulation? A million other little things we've gotten used to with .Net's everything-AND-the-kitchen-sink frameworks? MonoTouch.

  • Web services? MonoTouch.

  • Syntactically, they both have their advantages. Objective-C tends to be more verbose where you have to write it. You'll find yourself writing code with C# you wouldn't have to write with ObjC, but it goes both ways. This particular topic could fill a book. I prefer C# syntax, but after getting over my initial this-is-otherworldly reaction to Objective-C, I've learned to enjoy it quite a bit. I make fun of it a bit in talks (it is weird for devs who're used to C#/Java/etc.), but the truth is that I have an Objective-C shaped spot in my heart that makes me happy.

  • Do you plan to use Interface Builder? Because, even in this early version, I find myself doing far less work to build my UIs with IB and then using them in code. It feels like entire steps are missing from the Objective-C/IB way of doing things, and I'm pretty sure it's because entire steps are missing from the Objective-C/IB way of doing things. So far, and I don't think I've sufficiently tested, but so far, MonoTouch is the winner here for how much less work you have to do.

  • Do you think it's fun to learn new languages and platforms? If so, the iPhone has a lot to offer, and Apple's stack will likely get you out of your comfort-zone - which, for some devs, is fun (Hi - I'm one of those devs - I joke about it and give Apple a hard time, but I've had a lot of fun learning iPhone development through Apple's tools).

There are so many things to consider. Value is so abstract. If we're talking about cost and whether it's worth it, the answer comes down to my first bullet item: if this is for business, and if you can get the work, you'll make your money right back.

So... that's about as objective as I can be. This is a short list of what you might ask yourself, but it's a starting point.

Personally (let's drop the objectivity for a moment), I love and use both. And I'm glad I learned the Apple stack first. It was easier for me to get up and running with MonoTouch when I already knew my way around Apple's world. As others have said, you're still going to be working with CocoaTouch - it's just going to be in a .Net-ized environment.

But there's more than that. The people who haven't used MonoTouch tend to stop there - "It's a wrapper blah blah blah" - that's not MonoTouch.

MonoTouch gives you access to what CocoaTouch has to offer while also giving you access to what (a subset of) .Net has to offer, an IDE some people feel more comfortable with (I'm one of them), better integration with Interface Builder, and although you don't get to completely forget about memory-management, you get a nice degree of leeway.

If you aren't sure, grab Apple's stack (it's free), and grab the MonoTouch eval stack (it's free). Until you join Apple's dev program, both will only run against the simulator, but that's enough to help you figure out if you vastly prefer one to the other, and possible whether MonoTouch is, for you, worth the $399.

And don't listen to the zealots - they tend to be the ones who haven't used the technology they're railing against :)

520
ответ дан 23 November 2019 в 02:12
поделиться

В дополнение к тому, что уже сказали другие (ну!): Я чувствую, что вы, по сути, удваиваете количество ошибок, о которых вам нужно беспокоиться, добавляя ошибки в MonoTouch к тем уже в iPhone OS. Обновление для новых версий ОС будет еще более болезненным, чем обычно. Уф, все вокруг.

Единственный убедительный случай, который я вижу для MonoTouch, - это организации, у которых есть много-много программистов C # и кода C #, который они должны использовать на iPhone. (Такой магазин, который даже не мигает, стоит 3500 долларов.)

Но для тех, кто начинает с нуля, я действительно не считаю его стоящим или мудрым.

4
ответ дан 23 November 2019 в 02:12
поделиться

Если это единственное приложение для iPhone, которое вы когда-либо разрабатываете, и у вас вообще нет никакого интереса к разработке приложений для Mac, то MonoTouch, вероятно, того стоит.

Если вы когда-нибудь будете разрабатывать больше приложений для iPhone или когда-нибудь захотите заняться собственной разработкой для Mac, вероятно, стоит изучить Objective-C и связанные с ним фреймворки. Кроме того, если вы из тех программистов, которым нравится изучать новое, это интересная новая парадигма для изучения.

17
ответ дан 23 November 2019 в 02:12
поделиться

Итак, мой ответ на предыдущий аналогичный вопрос - изучить Objective-C. (Также не забывайте о поддержке отладки)

Это наверняка обидит некоторых, но будь честен, если ты собираешься делать что-нибудь серьезное развитие, вы должны научиться Цель-C. Незнание Objective-C в разработке iPhone будет просто помеха. Вы не сможете понимать много примеров; вы должны справиться с причудами Mono, тогда как если бы у вас были практические знания Objective-C вы можете получить намного больше из документации по платформе.

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

Другой пользователь также написал это:


Monotouch теперь проще для вас. Но сложнее позже.

Например, что происходит, когда появляются новые семена, которые вам нужно протестировать, но по какой-то причине сломать MonoTouch?

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

Еще одно соображение. заключается в том, что вы хотите использовать C #, потому что вы более знакомы с языком, чем Objective-C. Но большая часть кривой обучения для iPhone - это не Objective-C, это фреймворки, которые вам также придется вызвать с помощью C #.

Для любой платформы вы должны использовать платформу, которая напрямую выражает философию дизайна этой платформы - на iPhone, это Objective-C. Подумайте об этом с другой стороны: если бы разработчик Linux, привыкший программировать в GTK, хотел писать приложения для Windows, вы серьезно рекомендовали бы им не использовать C # и придерживаться GTK, потому что им было «проще» это сделать?


39
ответ дан 23 November 2019 в 02:12
поделиться

Лично я думаю, что вам будет лучше просто изучить Objective-C.

Короче:

  • " Это не экономит время, и вы тесно связаны с каким-то продуктом.

    РЕДАКТИРОВАТЬ: Я никогда не имел в виду ничего отрицательного в отношении .NET. Я был его большим поклонником. Я хочу сказать, что добавление дополнительных уровней сложности только потому, что вы еще не освоили причудливую нотацию скобок objc, для меня не имеет большого смысла.

    Обновление 2019 г .: 7 лет спустя. Я все еще чувствую то же самое, если не больше. Конечно, «предметно-ориентированный язык», возможно, был неправильным термином для использования, но я все же считаю, что гораздо лучше писать напрямую для платформы, с которой вы работаете, и по возможности избегать слоев совместимости и абстракций. Если вас беспокоит повторное использование и доработка кода, вообще говоря, любые функции, которые необходимо выполнять вашему кроссплатформенному приложению, вероятно, могут быть выполнены с помощью современных веб-технологий.

    РЕДАКТИРОВАТЬ: Я никогда не имел в виду ничего негативного в отношении .NET. Я был его большим поклонником. Я хочу сказать, что добавление дополнительных уровней сложности только потому, что вы еще не освоили причудливую нотацию скобок objc, для меня не имеет большого смысла.

    Обновление 2019 г .: 7 лет спустя. Я все еще чувствую то же самое, если не больше. Конечно, «предметно-ориентированный язык», возможно, был неправильным термином для использования, но я все же считаю, что гораздо лучше писать напрямую для платформы, с которой вы работаете, и по возможности избегать слоев совместимости и абстракций. Если вас беспокоит повторное использование и доработка кода, вообще говоря, любые функции, которые необходимо выполнять вашему кроссплатформенному приложению, вероятно, могут быть выполнены с помощью современных веб-технологий.

    РЕДАКТИРОВАТЬ: Я никогда не имел в виду ничего негативного в отношении .NET. Я был его большим поклонником. Я хочу сказать, что добавление дополнительных уровней сложности только потому, что вы еще не освоили причудливую нотацию скобок objc, для меня не имеет особого смысла.

    Обновление 2019 г .: 7 лет спустя. Я все еще чувствую то же самое, если не больше. Конечно, «предметно-ориентированный язык», возможно, был неправильным термином для использования, но я все же считаю, что гораздо лучше писать напрямую для платформы, с которой вы работаете, и по возможности избегать слоев совместимости и абстракций. Если вас беспокоит повторное использование и доработка кода, вообще говоря, любые функции, которые необходимо выполнять вашему кроссплатформенному приложению, вероятно, могут быть выполнены с помощью современных веб-технологий.

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

    Обновление 2019 г .: 7 лет спустя. Я все еще чувствую то же самое, если не больше. Конечно, «предметно-ориентированный язык», возможно, был неправильным термином для использования, но я все же считаю, что гораздо лучше писать напрямую для платформы, с которой вы работаете, и по возможности избегать слоев совместимости и абстракций. Если вас беспокоит повторное использование и доработка кода, вообще говоря, любые функции, которые необходимо выполнять вашему кроссплатформенному приложению, вероятно, могут быть выполнены с помощью современных веб-технологий.

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

    Обновление 2019 г .: 7 лет спустя. Я все еще чувствую то же самое, если не больше. Конечно, «предметно-ориентированный язык», возможно, был неправильным термином для использования, но я все же считаю, что гораздо лучше писать напрямую для платформы, с которой вы работаете, и по возможности избегать слоев совместимости и абстракций. Если вас беспокоит повторное использование и доработка кода, вообще говоря, любые функции, которые необходимо выполнять вашему кроссплатформенному приложению, вероятно, могут быть выполнены с помощью современных веб-технологий.

    Тем не менее, комфортно с причудливой записью скобок objc для меня не имеет особого смысла.

    Обновление 2019 г .: 7 лет спустя. Я все еще чувствую то же самое, если не больше. Конечно, «предметно-ориентированный язык», возможно, был неправильным термином для использования, но я все же считаю, что гораздо лучше писать напрямую для платформы, с которой вы работаете, и по возможности избегать слоев совместимости и абстракций. Если вас беспокоит повторное использование и доработка кода, вообще говоря, любые функции, которые необходимо выполнять вашему кроссплатформенному приложению, вероятно, могут быть выполнены с помощью современных веб-технологий.

    Тем не менее, комфортно с причудливой записью скобок objc для меня не имеет особого смысла.

    Обновление 2019 г .: 7 лет спустя. Я все еще чувствую то же самое, если не больше. Конечно, «предметно-ориентированный язык», возможно, был неправильным термином для использования, но я все же считаю, что гораздо лучше писать напрямую для платформы, с которой вы работаете, и по возможности избегать слоев совместимости и абстракций. Если вас беспокоит повторное использование и доработка кода, вообще говоря, любые функции, которые необходимо выполнять вашему кроссплатформенному приложению, вероятно, могут быть выполнены с помощью современных веб-технологий.

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

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

9
ответ дан 23 November 2019 в 02:12
поделиться

The cost of the MonoTouch library is entirely beside the point. The reason you shouldn't use Mono for your iPhone apps, is that it is a crutch. If you can't be bothered to learn the native tools, then I have no reason to believe that your product is worth downloading.

Edit: 4/14/2010 Applications written with MonoTouch aren't eligible for the iTunes Store. This is as it should be. Apple saw plenty of shallow ports on the Mac, using cross-platform toolkits like Qt, or Adobe's own partial re-implementation of the System 7 toolbox, and the long and short of it is they're just not good enough.

-35
ответ дан 23 November 2019 в 02:12
поделиться

Три слова: Linq to SQL

Да, это того стоит.

4
ответ дан 23 November 2019 в 02:12
поделиться

В этом сообщении много слухов от разработчиков, которые еще не пробовали MonoTouch и Objective-C. Похоже, что в основном это разработчики Objective-C, которые никогда не пробовали MonoTouch.

Я явно предвзято, но вы можете проверить, чем занимается сообщество MonoTouch, на:

http://xamarin.com

Там вы найдете несколько статей от разработчиков, которые работали на Objective-C и C #.

62
ответ дан 23 November 2019 в 02:12
поделиться

Использование Mono не является опорой. Есть много вещей, которые он добавляет в iPhone OS. LINQ, WCF, общий код между приложением Silverlight, страницей ASP.NET, приложением WPF, приложением Windows Form, а также моно для Android, и он также будет работать для Windows Mobile.

Итак, вы можете потратить куча времени на написание Objective-C (из многих исследований вы увидите, что один и тот же пример кода на C # писать значительно меньше, чем на OC), а затем ДУБЛИРОВАТЬ все это для других платформ. Что касается меня, я выбрал MonoTouch, потому что в облачном приложении, которое я пишу, будет много интерфейсов, и iPhone будет только одним из них. Обеспечить потоковую передачу данных WCF из облака в приложение MonoTouch безумно просто. У меня есть базовые библиотеки, которые используются на разных платформах, и мне нужно только написать простой уровень представления для развертываний iPhone / WinMobile / Android / SilverLight / WPF / ASP.NET. Воссоздание всего этого в Objective-C было бы огромной тратой времени как на начальную разработку, так и на обслуживание, поскольку продукт продолжает развиваться, поскольку все функции должны быть воспроизведены, а не использованы повторно.

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

Objective-C интересен и сильно отличается от многих распространенных языков. Мне нравится решать сложные задачи и изучать разные подходы ... но не тогда, когда это мешает моему прогрессу или создает ненужное перекодирование. В фреймворке iPhone SDK есть несколько действительно хороших вещей, но все это величие полностью поддерживается с помощью MonoTouch и исключает все ручное управление памятью, уменьшает количество кода, необходимого для выполнения тех же задач, позволяет мне повторно использовать мои сборки и оставляет мои варианты открытыми, чтобы иметь возможность перейти на другие устройства и платформы.

27
ответ дан 23 November 2019 в 02:12
поделиться

Что-то, что я хотел бы добавить , хотя есть общепринятый ответ - кто сказал, что Apple не будет просто отклонять приложения, в которых есть признаки того, что они созданы с использованием Mono Touch?

2
ответ дан 23 November 2019 в 02:12
поделиться

Я переключился. Monotouch давайте я буду писать приложения как минимум в 3-4 раза быстрее (4 приложения в месяц по сравнению с моим старым 1 в месяц в Obj C)

Меньше печатать.

Только мой опыт.

19
ответ дан 23 November 2019 в 02:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: