I have been programming for the iOS platform for the last few years but mainly using swift. In the recent months though, I have been tasked with a project using Objective C, and while I like it and found it easy to learn, there are some questions mainly about variables that I still don't quite understand.
1) What is the difference between declaring an instance variable and a property? Since the compiler automatically creates an instance variable for every property, is there any real advantage besides being able to pass in some parameters like atomic, nonatomic, strong, weak, assign, etc?
2) What is the difference between declaring variables in the @implementation or properties @interface inside the .m file? From what I understand, declaring in the @implementation makes it a static variable and declaring it in the @interface makes it an instance variable, is that correct? Also why do classes that inherit from UIViewController (for example) already have an @interface in the .m file and classes that inherit from NSObject don't?
3) (Personal Question) Do you usually set a property to be atomic or nonatomic? I find that atomic is better because while it may be slower it is thread safe, but I see most people using nonatomic. Is the speed difference still noticeable nowadays with the amount of power we have?
4) Whenever I declare two instance variables with the same name in the @implementation in two different classes I get a "duplicate symbol" error. Why does this happen?
Just another simple question out of curiosity: I see many questions where in the code the @interface has curly braces, but in my code I've never seen it, rather it ends with a @end like the @implementation file. Was this in earlier versions of Obj-C or is there any real difference?
Thank you so much, I know these are 4 or 5 questions, but I jumped so quickly into a project and I think I really need to learn the basics, which I skipped because I could not find answers to this questions.