I am looking to develop an applicate for OS X with Apple's XCode for the iPhone. I have a few classes that I have defined for Visual C++, but they should be fairly cross-platform. So I would like to use those C++ classes, but my impression is that the GUI builder and everything else is built to use obj-C. Are there any examples of mixing these two languages into the same app?
Objective-C and C++ work together mostly seamlessly. You can store Objective-C objects in C++ classes, structs and collections, and vice-versa. The one caveat is that Objective-C classes won't call constructors or destructors on C++ data members unless the Call C++ Default Ctor/Dtors in Objective-C compiler option is set. But, since this is set by default on the current version of Xcode, this shouldn't be an issue.
On the whole, mixing C++ and Objective-C works very well, and is almost a universal practice in game development, since C++ provides much better support for math libraries.
Related
I was wondering whether it is good to use swift programming language to create a framework for iOS application. I doubted how do we expose public interfaces in framework If I use swift. Usually ObjC framework has .h files in header folder inside the framework but swift can't.
See below post from apple https://developer.apple.com/swift/blog/?id=2
Appreciate any response on this post.
There are a few limitations regarding distributing Swift libraries, bundles, frameworks, etc...
You will need to document your API as relying on a header files only for developers to peruse won't cut it.
Mixing Swift and Objective-C is easy because of bridge technology but the technology doesn't extend to incompatible types across the bridge (struct is one of them.)
You need to package your Swift libraries in dynamic libraries. There is no way around static libraries in Swift.
Most of the early issues with naming have been ironed out, but there are still some gaps in what's available in foundation.
The C invocation is getting better with and even Swift2 deals with C function pointers in a less obscure way but Swift 2 is not out yet.
Some esoteric things you are used to with Objective-C are harder to implement with Swift. If you are going to lose the safety mode of Swift to be able to bit cast your objects, that defeats the purpose.
For most of these reasons, although I love the new language syntax, I chose to continue development of frameworks used in my app with the proven Objective-C and decided to move all the UI stuff in the application side to Swift. When Swift 2 is released, I will then reconsider this choice.
Simple question really, however there doesn't seem to be a straight answer in the current developer documentation.
Does Swift compile to machine language (i.e. assembly), or does it compile to some intermediary form that then runs on a virtual machine?
(I suspect it does, but being unfamiliar with development in Apple's world it is not clear to me like it may be to someone who is.)
Yes, it compiles to machine language by way of LLVM Bitcode and, as #connor said, runs on top of the Objective-C runtime.
Swift not only compiles to native machine code but it has also been designed specifically for it. Unlike e.g. Java which has been designed specifically as a JITed language. By that I mean Swift achieves best performance with ahead of time compilation while Java benefits most from JITing.
There are many reasons for these design choices but among them is that Swift has a much bigger scope than managed languages like Java. It is supposed to work on both desktop computers and phones with more restricted hardware. You can use Swift as a systems programming language unlike say C#, Java or Python because it has little runtime requirements and allow fairly detailed control of memory. So in theory one should be able to build an OS kernel with Swift which would be difficult with say Java.
Swift, just like objective-c compiles to native code using llvm
A good explanation can be found in Apple's top secret Swift language grew from work to sustain Objective C, which it now aims to replace
From that article, talking about Swift
The compiler is optimized for performance, and the language is
optimized for development, without compromising on either.
Swift, like Objective-C, is compiled to machine code that runs on the Objective-C runtime.
I have some pure C++ codes are have I want to change the code as objective C code format. How can do this there is an any tools are there or else how can i do this.
You can compile C++ code to work on the iphone directly. Keep your core as pure C++, and write the bits that need to talk to objective-C libraries as objective-C++ ( .mm rather than .m IIRC ).
It's not possible automatically to translate C++ to Objective-C in the sense that you are asking. Picking just one of the large semantic differences at random, C++ allows multiple inheritance and Objective-C doesn't. You therefore can't map the inheritance graph of C++ onto the inheritance graph of Objective-C.
What you'd do if you were converting manually would be to switch to protocols where what you're meaning to establish is a published set of permissible communications and object composition where you wanted an object to combine some other logic. You'd probably keep the main line of inheritance in a lot of cases. However you're not going to find a tool capable of automating that process.
You can refer following question :here
and you can compile c++ code directly by changing vc.m to vc.mm
This question is related to one of my others about C: What can you do in C without “std” includes? Are they part of “C,” or just libraries?
I've become curious lately as to what is really contained the the core Objective-C language, and what parts of the Objective-C I've done for iPhone/OS X development is specific to Apple platforms.
I know that things like syntax are the same, but for instance, is NSObject and its torrent of NS-subclasses actually part of "standard" Objective-C? Could I use them in, say, Windows?
What parts are universal for the most part, and what parts would I only find on an Apple platform?
If you want, giving an example of Objective-C used elsewhere as an example of what is more "universal" would help me as well.
Thanks! =)
There are only two current implementations of the core Objective-C libraries, previously known as the NextStep (hence NS prefixes) and OPENSTEP: GNUStep and Apple's OS X. On Linux, if you maintain compatibility with the OPENSTEP specification, GNUStep works very well. However, the specification is ancient, and modern code for OS X will likely not work correctly (especially in the UI area). The situation on Windows is even worse.
You can use the Objective-C language anywhere GCC supports the build target. The "NS" classes are not part of the language proper.
If you're trying to maintain compatibility across platforms in your code base, stick to C or C++, only move UI specific behavior to Objective-C.
Objective-c is C plus these keywords:
#interface, #implementation, #protocol, #end, #private, #protected, #public, #try,
#throw, #catch, #finally, #class, #selector, #encode, #"string", #synchronized,
#property, #synthesized
Plus the message sending syntax: [anObject aMessage];
EDIT
Given that you have an objective-c compiler such as GCC you still need an Objective-c runtime in order to make the above stuff work. e.g. [anObject aMessage] is actually compiled to
objc_msgSend( anObject, #selector(aMessage));
...therefore the symbol objc_msgSend is one of several that must exist at runtime. In theory this could be provided by a compiler intrinsic but in practice you are probably going to link to an Objective-c runtime library - a quick search of my hard drive shows i have three installed:- Apple's, GNUStep, and Cocotron - there are more but Apple's (open source) is without doubt the most important and influential.
With an Objective-c compiler and runtime - but without any Apple Objective-c frameworks (NSObject, etc.) - you have a fabulous and very useful C-with-Classses that is much simpler (where simpler means 'better for me') than C++.
You can a lot on Windows using Cocotron, which is a free implementation of Apple's frameworks. It's not complete, and you may run into bugs, but if you're lucky, you can compile your Xcode project as a Windows app without too many changes.
None of the class library is part of the language itself. If you want to see the core Objective-C types, look in include/objc. The core language itself, without any added library, is really scant and not particularly useful.
In practice, however, Objective-C is just about never used outside of the context of an OpenStep framework like Cocoa or GNUstep. So you could view that as the de facto standard library, in which case Foundation is almost universal. (Not 100% of Foundation is that way, but the majority is.)
I've been learning C++ for some months now and find it an excellent language albeit its perks.
I was wondering what exactly is the so-called Objective-C++ and if it's worth learning it as a main development language to target Apple environments (ie. Mac OS X, iPhone OS). Searching around the web I only found a couple of good articles: mainly Wikipedia's entry and one from Mac Dev Center.
Wikipedia says:
Objective-C++ is a front-end to the GNU Compiler Collection which can compile source files which use a combination of C++ and Objective-C syntax. Objective-C++ adds to C++ the extensions Objective-C adds to C.
The Mac Dev Center article adds:
Apple’s Objective-C compiler allows you to freely mix C++ and Objective-C code in the same source file. This Objective-C/C++ language hybrid is called Objective-C++. With it you can make use of existing C++ libraries from your Objective-C applications.
The Apple article calls Objective-C++ a language. Is this right?
I would like to know the following:
Is it possible to learn and use Objective-C++ without knowing C/Objective-C?
Are there any good books, sites, forums, etc where one can get more information and/or help?
Are there any big projects done in Objective-C++ as far as you know of?
Yes you should learn Objective-C++ when you want to develop competitive comnerical strength (aka so good that people are willing to pay for them) Apple applications.
It is indeed nothing else the Objective-C and C++ combined in the same file.
For Objective-C use any of the hunderts of the popular apple development blogs/mailing lists/newsgroups. Especially the one directly provided by Apple.
For C++ this is the same, dozens of blogs/mailing lists/starter tutorials are there. But while C and its Objective-C add-on is pretty simple and easy to learn if you already understand programming. C++ is a total different and complex beast. Get a few good books and learn it (after 10 years you will be able to fully understand the language :-) but you can writing C++ programs with just a fraction of this knowledge.
So and now the magic question why you should use C++ when you could get away with Objective-C. The answer is pretty simple. Beside the obvious mentioned wrapping of existing C++ libraries, Objective-C is slow, first of all - method call. THe usual adivse is to do something serious in your methods to avoid this runtime penality that shows up in this language.
But especially for Containers you should really consider to use C++ templates. A vector is much much faster then an NSArray. If your dataset is large you will feel the difference. Also i find C++ containers easier to use because they avoid the typecasts you have to do with Objective-C.
With slow ARM CPU's on iPad and iPhone this is not premature optimization.
Unfortunately you can't mix C++ and Cocoa classes and therefore C++ should only be used for algorithmic data. For the GUI you have to use Cocoa and Objective-C classes.
Getting the right balance between C++ and Objective-C is some part of the skills you need to develop as a Apple programmer.
Objective-C++ is really just mixing Objective-C with C++. Since it allows syntax from both you could argue that it is a new language.
I primarily use ObjC++ (.mm source files) when I have to interface Objective-C code with some C++ library. It is convenient to be able to call C++ in that case. Personally I do not know a lot of people who actually really mix C++ and Objective-C.
OBJECTIVE-C++
Objective-C is a small set of extensions to ANSI C. Objective-C++ is the same set of extensions applied to C++. Apple’s Objective-C compiler is also an Objective-C++ compiler.
One of the advantages of Objective-C is that, as a super-set of ANSI C, it can be easily mixed with the millions of lines of existing C code in the world. Objective-C++ can be mixed with the millions of lines of C++ code that already exist. C++ features, such as name mangling, are fully supported by Objective-C++ so that direct linkage between Objective-C++ code and existing C++ code is possible.
Objective-C source code files are identified by the .m extension. Apple’s compiler treats files with the .M or .mm extensions as Objective-C++ source code. Additionally, the –x compiler option can be used to instruct Apple’s compiler to treat any input file as Objective-C++ source code.
Apple’s online documentation describes the features and limitations of Objective-C++ at http://developer.apple.com/techpubs/, and in the release notes that come with Apple’s developer tools. In general, Objective-C classes and C++ classes can be intermixed so that an Objective-C method can call a C++ member function and visa versa or a C++ class can include a pointer to an Objective-C object as a member variable. Objective-C classes cannot inherit from C++ classes or the other way around. The two class hierarchies must remain distinct. The semantics regarding instance creation and deletion are dramatically different between C++ and Objective-C. As a result, mixing them can be tricky, but the benefit of reusing existing C++ code in new Objective-C projects outweighs the complications that it introduces.
Some more practical points about Objective-C++
Gcc is at once a compiler for C, Objective-C, and C++. You can intermix C++ and Objective-C code to some degree. To instruct the compiler that a file contains C++ code as well as Objective-C, use the file extension .mm or .M instead of .m.
Following are some ways in which C++ and Objective-C code can be used together:
Objective-C objects can have fields that point to C++ objects, and vice versa.
Objective-C code can call methods on C++ objects, and vice versa.
Objective-C objects can have C++ objects (as opposed to pointers) as fields, but only if the C++ class has no virtual methods.
However, Objective-C and C++ are not completely compatible. Here are some things you can't do:
Objective-C classes can't inherit from C++ classes, and vice versa.
You can't declare Objective-C classes in C++ namespaces or templates, or vice versa.
You can't use C++ keywords for Objective-C variable names.
You can't call Objective-C methods with C++ syntax, or vice versa.
Finally, there are some restrictions that are imposed to avoid ambiguity:
You can't use the name id as a C++ template name. If you could, the declaration id< TypeName > var could be either a C++ template declaration or an Objective-C declaration using a protocol.
If you are passing a globally-scoped C++ variable to an Objective-C method, you need a space between the first and second colons.
You might find these link helpful :-
https://www.raywenderlich.com/62989/introduction-c-ios-developers-part-1
https://www.raywenderlich.com/62990/introduction-c-ios-developers-part-2
https://www.sitepoint.com/using-c-and-c-in-an-ios-app-with-objective-c/
https://github.com/sitepoint-editors/HelloCpp
1) i doubt it, because everyone of them is a superset of the C language.
i don't consider objective-c++ a totally new language. it is just a mix of both that gives you some additional possibilities - i.e. reuse existing c++ code, or use faster c++ in more time critical code sections, or use c++ code where no objective-c / cocoa interface is exposed (mainly hardware related lowlevel stuff like serial ports / ioctls, opengl, ...)
2) i think resources regarding this topics a
3) pass ... i mean what do you consider big. i just know from a bunch of projects (maybe not all of them commercial in the sense that you can buy the software in the store) that use this mix for the reasons listed in 1.
Plenty of large projects use some Objective-C++. Camino, Chromium, and Firefox, for example, are all substantial open-source projects that include Objective-C++.