diff options
Diffstat (limited to 'objective-c.html (levi-dell-banno-laptop's conflicted copy 2014-01-07).markdown')
-rw-r--r-- | objective-c.html (levi-dell-banno-laptop's conflicted copy 2014-01-07).markdown | 446 |
1 files changed, 0 insertions, 446 deletions
diff --git a/objective-c.html (levi-dell-banno-laptop's conflicted copy 2014-01-07).markdown b/objective-c.html (levi-dell-banno-laptop's conflicted copy 2014-01-07).markdown deleted file mode 100644 index 490fefee..00000000 --- a/objective-c.html (levi-dell-banno-laptop's conflicted copy 2014-01-07).markdown +++ /dev/null @@ -1,446 +0,0 @@ ---- - -language: Objective-C -contributors: - - ["Eugene Yagrushkin", "www.about.me/yagrushkin"] - - ["Yannick Loriot", "https://github.com/YannickL"] -filename: LearnObjectiveC.m - ---- - -Objective-C is the main programming language used by Apple for the OS X and iOS operating systems and their respective frameworks, Cocoa and Cocoa Touch. -It is a general-purpose, object-oriented programming language that adds Smalltalk-style messaging to the C programming language. - -```cpp -// Single-line comments start with // - -/* -Multi-line comments look like this. -*/ - -// Imports the Foundation headers with #import -#import <Foundation/Foundation.h> -#import "MyClass.h" - -// Your program's entry point is a function called -// main with an integer return type. -int main (int argc, const char * argv[]) -{ - // Create an autorelease pool to manage the memory into the program - NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; - // If using automatic reference counting (ARC), use @autoreleasepool instead: - @autoreleasepool { - - // Use NSLog to print lines to the console - NSLog(@"Hello World!"); // Print the string "Hello World!" - - /////////////////////////////////////// - // Types & Variables - /////////////////////////////////////// - - // Primitive declarations - int myPrimitive1 = 1; - long myPrimitive2 = 234554664565; - - // Object declarations - // Put the * in front of the variable names for strongly-typed object declarations - MyClass *myObject1 = nil; // Strong typing - id myObject2 = nil; // Weak typing - // %@ is an object - // 'description' is a convention to display the value of the Objects - NSLog(@"%@ and %@", myObject1, [myObject2 description]); // Print "(null) and (null)" - - // String - NSString *worldString = @"World"; - NSLog(@"Hello %@!", worldString); // prints => "Hello World!" - // NSMutableString is a mutable version of the NSString object. - NSMutableString *mutableString = [NSMutableString stringWithString:@"Hello"]; - [mutableString appendString:@" World!"]; - NSLog(@"%@", mutableString); // prints => "Hello World!" - - // Character literals - NSNumber *theLetterZNumber = @'Z'; - char theLetterZ = [theLetterZNumber charValue]; // or 'Z' - NSLog(@"%c", theLetterZ); - - // Integral literals - NSNumber *fortyTwoNumber = @42; - int fortyTwo = [fortyTwoNumber intValue]; // or 42 - NSLog(@"%i", fortyTwo); - - NSNumber *fortyTwoUnsignedNumber = @42U; - unsigned int fortyTwoUnsigned = [fortyTwoUnsignedNumber unsignedIntValue]; // or 42 - NSLog(@"%u", fortyTwoUnsigned); - - NSNumber *fortyTwoShortNumber = [NSNumber numberWithShort:42]; - short fortyTwoShort = [fortyTwoShortNumber shortValue]; // or 42 - NSLog(@"%hi", fortyTwoShort); - - NSNumber *fortyTwoShortNumber = [NSNumber numberWithShort:41]; - unsigned short fortyTwoUnsigned = [fortyTwoShortNumber unsignedShortValue]; // or 41 - NSLog(@"%hu", fortyTwoUnsigned); - - NSNumber *fortyTwoLongNumber = @42L; - long fortyTwoLong = [fortyTwoLongNumber longValue]; // or 42 - NSLog(@"%li", fortyTwoLong); - - NSNumber *fortyTwoLongNumber = @53L; - unsigned long fiftyThreeUnsigned = [fortyTwoLongNumber unsignedLongValue]; // or 53 - NSLog(@"%lu", fiftyThreeUnsigned); - - // Floating point literals - NSNumber *piFloatNumber = @3.141592654F; - float piFloat = [piFloatNumber floatValue]; // or 3.141592654f - NSLog(@"%f", piFloat); // prints => 3.141592654 - NSLog(@"%5.2f", piFloat); // prints => " 3.14" - - NSNumber *piDoubleNumber = @3.1415926535; - double piDouble = [piDoubleNumber doubleValue]; // or 3.1415926535 - NSLog(@"%f", piDouble); - NSLog(@"%4.2f", piDouble); // prints => "3.14" - - // NSDecimalNumber is a fixed-point class that's more precise then float or double - NSDecimalNumber *oneDecNum = [NSDecimalNumber decimalNumberWithString:@"10.99"]; - NSDecimalNumber *twoDecNum = [NSDecimalNumber decimalNumberWithString:@"5.002"]; - // NSDecimalNumber isn't able to use standard +, -, *, / operators so it provides its own: - [oneDecNum decimalNumberByAdding:twoDecNum]; - [oneDecNum decimalNumberBySubtracting:twoDecNum]; - [oneDecNum decimalNumberByMultiplyingBy:twoDecNum]; - [oneDecNum decimalNumberByDividingBy:twoDecNum]; - NSLog(@"%@", oneDecNum); // prints => 10.99 as NSDecimalNumber is immutable. - - // BOOL literals - NSNumber *yesNumber = @YES; - NSNumber *noNumber = @NO; - // or - BOOL yesBool = YES; - BOOL noBool = NO; - NSLog(@"%i", yesBool); // prints => 1 - - // Array object - NSArray *anArray = @[@1, @2, @3, @4]; - NSNumber *thirdNumber = anArray[2]; - NSLog(@"Third number = %@", thirdNumber); // Print "Third number = 3" - // NSMutableArray is mutable version of NSArray allowing to change items in array - // and extend or shrink array object. Convenient, but not as efficient as NSArray. - NSMutableArray *mutableArray = [NSMutableArray arrayWithCapacity:2]; - [mutableArray addObject:@"Hello"]; - [mutableArray addObject:@"World"]; - [mutableArray removeObjectAtIndex:0]; - NSLog(@"%@", [mutableArray objectAtIndex:0]); // prints => "World" - - // Dictionary object - NSDictionary *aDictionary = @{ @"key1" : @"value1", @"key2" : @"value2" }; - NSObject *valueObject = aDictionary[@"A Key"]; - NSLog(@"Object = %@", valueObject); // Print "Object = (null)" - // NSMutableDictionary also available as a mutable dictionary object. - NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionaryWithCapacity:2]; - [mutableDictionary setObject:@"value1" forKey:@"key1"]; - [mutableDictionary setObject:@"value2" forKey:@"key2"]; - [mutableDictionary removeObjectForKey:@"key1"]; - - // Set object - NSSet *set = [NSSet setWithObjects:@"Hello", @"Hello", @"World", nil]; - NSLog(@"%@", set); // prints => {(Hello, World)} (may be in different order) - // NSMutableSet also available as a mutable set object. - NSMutableSet *mutableSet = [NSMutableSet setWithCapacity:2]; - [mutableSet addObject:@"Hello"]; - [mutableSet addObject:@"Hello"]; - NSLog(@"%@", mutableSet); // prints => {(Hello)} - - // Set object - NSSet *set = [NSSet setWithObjects:@"Hello", @"Hello", @"World", nil]; - NSLog(@"%@", set); // prints => {(Hello, World)} - - /////////////////////////////////////// - // Operators - /////////////////////////////////////// - - // The operators works like in the C language - // For example: - 2 + 5; // => 7 - 4.2f + 5.1f; // => 9.3f - 3 == 2; // => 0 (NO) - 3 != 2; // => 1 (YES) - 1 && 1; // => 1 (Logical and) - 0 || 1; // => 1 (Logical or) - ~0x0F; // => 0xF0 (bitwise negation) - 0x0F & 0xF0; // => 0x00 (bitwise AND) - 0x01 << 1; // => 0x02 (bitwise left shift (by 1)) - - /////////////////////////////////////// - // Control Structures - /////////////////////////////////////// - - // If-Else statement - if (NO) - { - NSLog(@"I am never run"); - } else if (0) - { - NSLog(@"I am also never run"); - } else - { - NSLog(@"I print"); - } - - // Switch statement - switch (2) - { - case 0: - { - NSLog(@"I am never run"); - } break; - case 1: - { - NSLog(@"I am also never run"); - } break; - default: - { - NSLog(@"I print"); - } break; - } - - // While loops statements - int ii = 0; - while (ii < 4) - { - NSLog(@"%d,", ii++); // ii++ increments ii in-place, after using its value. - } // => prints "0," - // "1," - // "2," - // "3," - - // For loops statements - int jj; - for (jj=0; jj < 4; jj++) - { - NSLog(@"%d,", jj); - } // => prints "0," - // "1," - // "2," - // "3," - - // Foreach statements - NSArray *values = @[@0, @1, @2, @3]; - for (NSNumber *value in values) - { - NSLog(@"%@,", value); - } // => prints "0," - // "1," - // "2," - // "3," - - // Object for loop statement. Can be used with any Objective-C object type. - for (id item in values) { - NSLog(@"%@,", item); - } // => prints "0," - // "1," - // "2," - // "3," - - // Try-Catch-Finally statements - @try - { - // Your statements here - @throw [NSException exceptionWithName:@"FileNotFoundException" - reason:@"File Not Found on System" userInfo:nil]; - } @catch (NSException * e) - { - NSLog(@"Exception: %@", e); - } @finally - { - NSLog(@"Finally"); - } // => prints "Exception: File Not Found on System" - // "Finally" - - /////////////////////////////////////// - // Objects - /////////////////////////////////////// - - // Create an object instance by allocating memory and initializing it. - // An object is not fully functional until both steps have been completed. - MyClass *myObject = [[MyClass alloc] init]; - - // The Objective-C model of object-oriented programming is based on message - // passing to object instances. - // In Objective-C one does not simply call a method; one sends a message. - [myObject instanceMethodWithParameter:@"Steve Jobs"]; - - // Clean up the memory you used into your program - [pool drain]; - - // End of @autoreleasepool. - } - - // End the program - return 0; -} - -/////////////////////////////////////// -// Classes And Functions -/////////////////////////////////////// - -// Declare your class in a header file (MyClass.h): -// Class declaration syntax: -// @interface ClassName : ParentClassName <ImplementedProtocols> -// { -// type name; <= variable declarations; -// } -// @property type name; <= property declarations. -// -/+ (type) Method declarations; <= Method declarations. -// @end -@interface MyClass : NSObject <MyProtocol> // NSObject is Objective-C's base object class. -{ - // Instance variable declarations (can exist in either interface or implementation file). - int count; // Protected access by default. - @private id data; // Private access. (More convenient to declare in implementation file). - NSString *name; -} -// Convenient notation for public access variables to auto generate a setter method. -// By default, setter method name is 'set' followed by @property variable name. -@property int count; // Setter name = 'setCount' -@property (copy) NSString *name; // (copy) => Copy the object during assignment. -@property (readonly) id data; // (readonly) => Declare only a getter method. -// You can customize the getter and setter names instead of using default 'set' name: -@property (getter=lengthGet, setter=lengthSet:) int length; - -// Methods -+/- (return type)methodSignature:(Parameter Type *)parameterName; - -// + for class method -+ (NSString *)classMethod; - -// - for instance method -- (NSString *)instanceMethodWithParameter:(NSString *)string; -- (NSNumber *)methodAParameterAsString:(NSString*)string andAParameterAsNumber:(NSNumber *)number; - -@end // States the end of the interface. - - -// To access public variables from the implementation file, @property generates a setter method -// automatically. Method name is 'set' followed by @property variable name: -MyClass *myClass = [[MyClass alloc] init]; // create MyClass object instance. -[myClass setCount:10]; -NSLog(@"%@", [myClass count]); // prints => 10 -// Or using the custom getter and setter method defined in @interface: -[myClass lengthSet:32]; -NSLog(@"%i", [myClass lengthGet]); // prints => 32 -// For convenience, you may use dot notation to set and access object instance variables: -myClass.count = 45; -NSLog(@"%i", myClass.count); // prints => 45 - - -// Implement the methods in an implementation (MyClass.m) file: -@implementation MyClass { - long distance; // Private access instance variable. -} - -// To access public variable from the interface file, use '_' followed by variable name: -_count = 5; // References "int count" from MyClass interface. -NSLog(@"%d", _count); // prints => 5 -// Access variables defined in implementation file: -distance = 18; // References "long distance" from MyClass implementation. -NSLog(@"%li", distance); // prints => 18 - -// Call when the object is releasing -- (void)dealloc -{ -} - -// Constructors are a way of creating classes -// This is a default constructor which is called when the object is creating -- (id)init -{ - if ((self = [super init])) - { - self.count = 1; - } - return self; -} - -+ (NSString *)classMethod -{ - return [[self alloc] init]; -} - -- (NSString *)instanceMethodWithParameter:(NSString *)string -{ - return @"New string"; -} - -- (NSNumber *)methodAParameterAsString:(NSString*)string andAParameterAsNumber:(NSNumber *)number -{ - return @42; -} - -// Methods declared into MyProtocol -- (void)myProtocolMethod -{ - // statements -} - -@end // States the end of the implementation. - -/* - * A protocol declares methods that can be implemented by any class. - * Protocols are not classes themselves. They simply define an interface - * that other objects are responsible for implementing. - */ -@protocol MyProtocol - - (void)myProtocolMethod; -@end - - -/////////////////////////////////////// -// Memory Management -/////////////////////////////////////// -/* -For each object used in an application, memory must be allocated for that object. When the application -is done using that object, memory must be deallocated to ensure application efficiency. -Objective-C does not use garbage collection and instead uses reference counting. As long as -there is at least one reference to an object (also called "owning" an object), then the object -will be available to use (known as "ownership"). - -When an instance owns an object, its reference counter is increments by one. When the -object is released, the reference counter decrements by one. When reference count is zero, -the object is removed from memory. - -With all object interactions, follow the pattern of: -(1) create the object, (2) use the object, (3) then free the object from memory. -*/ - -MyClass *classVar = [MyClass alloc]; // alloc sets classVar's reference count to one. Returns pointer to object. -[classVar release]; // Decrements classVar's reference count. -// retain claims ownership of existing object instance and increments reference count. Returns pointer to object. -MyClass *newVar = [classVar retain]; // If classVar is released, object is still in memory because newVar is owner. -[classVar autorelease]; // Removes ownership of object at end of @autoreleasepool block. Returns pointer to object. - -// @property can use retain or assign as well for small convenient definitions. -@property (retain) MyClass *instance; // Release old value and retain a new one (strong reference). -@property (assign) NSSet *set; // Pointer to new value without retaining/releasing old (weak reference). - -// Because memory management can be a pain, Xcode 4.2 and iOS 4 introduced Automatic Reference Counting (ARC). -// ARC is a compiler feature that inserts retain, release, and autorelease automatically for you, so when using ARC, -// you must not use retain, relase, or autorelease. -MyClass *arcMyClass = [[MyClass alloc] init]; // Without ARC, you will need to call: [arcMyClass release] after -// you're done using arcMyClass. But with ARC, there is no need. It will insert this release statement for you. - -// As for the "assign" and "retain" @property attributes, with ARC you use "weak" and "strong". -@property (weak) MyClass *weakVar; // weak does not take ownership of object. If original instance's reference count -// is set to zero, weakVar will automatically receive value of nil to avoid application crashing. -@property (strong) MyClass *strongVar; // strong takes ownership of object. Ensures object will stay in memory to use. - -// For regular variables (not @property declared variables), use the following: -__strong NSString *strongString; // Default. Variable is retained in memory until it leaves it's scope. -__weak NSSet *weakSet; // Weak reference to existing object. When existing object is released, weakSet is set to nil. -__unsafe_unretained NSArray *unsafeArray; // Like __weak but unsafeArray not set to nil when existing object is released. - -``` -## Further Reading - -[Wikipedia Objective-C](http://en.wikipedia.org/wiki/Objective-C) - -[Programming with Objective-C. Apple PDF book](https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/ProgrammingWithObjectiveC.pdf) - -[iOS For High School Students: Getting Started](http://www.raywenderlich.com/5600/ios-for-high-school-students-getting-started) |