{"id":689,"date":"2017-01-08T04:21:31","date_gmt":"2017-01-07T19:21:31","guid":{"rendered":"http:\/\/www.uturtle.com\/blog\/?p=689"},"modified":"2017-01-12T02:27:18","modified_gmt":"2017-01-11T17:27:18","slug":"modern-objective-c%ec%9c%bc%eb%a1%9c-%eb%a6%ac%ed%8c%a9%ed%86%a0%eb%a7%81","status":"publish","type":"post","link":"https:\/\/www.jinukbaek.com\/blog\/ko\/archives\/689","title":{"rendered":"[\ubc88\uc5ed] Modern Objective-C \uad6c\ubb38\uc73c\ub85c \ub9ac\ud329\ud1a0\ub9c1"},"content":{"rendered":"<blockquote><p><strong>\uc54c\ub9bc<\/strong><br \/>\n\uc774 \uae00\uc740 Qiita\uc5d0 \uac8c\uc2dc\ub41c &#8220;Modern Objective-C \u30d3\u30d5\u30a9\u30fc\u30a2\u30d5\u30bf\u30fc&#8221;(<a href=\"http:\/\/qiita.com\/makoto_kw\/items\/d86fada0e38e9245912a\">http:\/\/qiita.com\/makoto_kw\/items\/d86fada0e38e9245912a<\/a>\u00a0, 2014-04-16 \uc218\uc815\ubcf8 \uae30\uc900), makoto_kw\ub2d8\uc774 \uc791\uc131\ud55c \uae00\uc744 \ubc88\uc5ed\ud55c \uac83\uc785\ub2c8\ub2e4.<\/p><\/blockquote>\n<p>Objective-C \uc5b8\uc5b4\ub294 2017\ub144 \ud604\uc7ac\ub3c4 \uc5ec\uc804\ud788 \ub9ce\uc740 \uc218\uc758 \uc0ac\uc6a9\uc790\uac00 \uc0ac\uc6a9\ud558\uace0 \uc788\ub294 \uc5b8\uc5b4\uc774\ub2e4[1]. \ucd5c\uadfc Objective-C\uc758 \uad00\uc2ec\uc774 Swift\uc758 \uc601\ud5a5\uc73c\ub85c \uadfc\ub798\uc758 \uc6f9\uc5d0\uc11c \ucd5c\uadfc \uc790\ub8cc\ub97c \ucc3e\uae30 \ud798\ub4e0 \uac83\uc774 \uc0ac\uc2e4\uc774\ub2e4. \uc774 \uc790\ub8cc\ub294 \uaf64 \uc624\ub798\ub41c \uac83\uc774\uc9c0\ub9cc \ud68c\uc0ac\uc5d0\uc11c \ucf54\ub4dc \ub9ac\ud329\ud1a0\ub9c1 \uc5c5\ubb34\ub97c \ud558\uba74\uc11c modern objective-c \ud615\uc2dd\uc73c\ub85c \ubcc0\uacbd\uc774 \ud544\uc694\ud558\uc5ec \ucc38\uc870\ud55c \uc790\ub8cc\uc774\ub2e4. \uc774\ub97c \uc0ac\uc6a9\ud558\uba74 \uae30\uc874 \ubc29\uc2dd\uc5d0 \ube44\ud574 \ucf54\ub4dc\uc758 \uae38\uc774\ub97c \ub9ce\uc774 \uc904\uc77c \uc218 \uc788\uc73c\uba70 \ubd88\ud544\uc694\ud55c \uc120\uc5b8 \ucf54\ub4dc\ub97c \uc904\uc77c \uc218 \uc788\ub2e4\ub294 \uac83\uc744 \uc54c\uac8c\ub420 \uac83\uc774\ub2e4. \ubb3c\ub860 \uc774 \ubc29\ubc95\uc774 \ub098\uc628\uc9c0 \uaf64 \uc624\ub798\ub418\uc5c8\uae30 \ub54c\ubb38\uc5d0 \uc544\ub9c8 \ub300\ubd80\ubd84\uc758 Objective-C \uac1c\ubc1c\uc790\ub4e4\uc740 \uc54c\uace0 \uc788\uc744 \uac83\uc73c\ub85c \uc608\uc0c1\ub418\uc9c0\ub9cc \uc544\uc9c1 \uc774 \uc0ac\uc2e4\uc5d0 \ub300\ud558\uc5ec \uc54c\uc9c0 \ubabb\ud558\ub294 \ubd84\ub4e4\uc744 \uc704\ud574 \ub3c4\uc6c0\uc774 \ub420 \uc218 \uc788\uc5c8\uc73c\uba74 \uc88b\uaca0\ub2e4.<\/p>\n<h1><a href=\"https:\/\/developer.apple.com\/library\/content\/releasenotes\/ObjectiveC\/ModernizationObjC\/AdoptingModernObjective-C\/AdoptingModernObjective-C.html\">Adopting Modern Objective-C<\/a><\/h1>\n<h2 id=\"toc_0\">instancetype<\/h2>\n<p><code>instancetype<\/code> \ub97c \uc0ac\uc6a9\ud558\uba74 \ucef4\ud30c\uc77c\ub7ec\uac00 \ud0c0\uc785 \uccb4\ud06c\uac00 \uac00\ub2a5\ud568<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>@interface MyObject\r\n- (id)myFactoryMethod;\r\n@end\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@interface MyObject\r\n- (instancetype)myFactoryMethod;\r\n@end\r\n<\/code><\/pre>\n<h2 id=\"toc_1\">Enumeration Macros<\/h2>\n<p>&#8220;iOS6 SDK&#8221;\ubd80\ud130 \ucd94\uac00\ub41c \ub9e4\ud06c\ub85c<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>enum {\r\n    UITableViewCellStyleDefault,\r\n    UITableViewCellStyleValue1,\r\n    UITableViewCellStyleValue2,\r\n    UITableViewCellStyleSubtitle\r\n};\r\ntypedef NSInteger UITableViewCellStyle;\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>typedef NS_ENUM(NSInteger, UITableViewCellStyle) {\r\n    UITableViewCellStyleDefault,\r\n    UITableViewCellStyleValue1,\r\n    UITableViewCellStyleValue2,\r\n    UITableViewCellStyleSubtitle\r\n};\r\n<\/code><\/pre>\n<p>bitmask\ub294 <code>NS_OPTIONS<\/code> \ub97c \uc0ac\uc6a9<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>enum {\r\n    UIViewAutoresizingNone                 = 0,\r\n    UIViewAutoresizingFlexibleLeftMargin   = 1 &lt;&lt; 0,\r\n    UIViewAutoresizingFlexibleWidth        = 1 &lt;&lt; 1,\r\n    UIViewAutoresizingFlexibleRightMargin  = 1 &lt;&lt; 2,\r\n    UIViewAutoresizingFlexibleTopMargin    = 1 &lt;&lt; 3,\r\n    UIViewAutoresizingFlexibleHeight       = 1 &lt;&lt; 4,\r\n    UIViewAutoresizingFlexibleBottomMargin = 1 &lt;&lt; 5\r\n};typedef NSUInteger UIViewAutoresizing;\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {\r\n    UIViewAutoresizingNone                 = 0,\r\n    UIViewAutoresizingFlexibleLeftMargin   = 1 &lt;&lt; 0,\r\n    UIViewAutoresizingFlexibleWidth        = 1 &lt;&lt; 1,\r\n    UIViewAutoresizingFlexibleRightMargin  = 1 &lt;&lt; 2,\r\n    UIViewAutoresizingFlexibleTopMargin    = 1 &lt;&lt; 3,\r\n    UIViewAutoresizingFlexibleHeight       = 1 &lt;&lt; 4,\r\n    UIViewAutoresizingFlexibleBottomMargin = 1 &lt;&lt; 5};\r\n<\/code><\/pre>\n<hr \/>\n<h1><a href=\"https:\/\/developer.apple.com\/videos\/play\/wwdc2012\/413\/\">Migrating to Modern Objective-C<\/a><\/h1>\n<h2 id=\"toc_2\">Importing Headers<\/h2>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>#import &lt;Foundation\/NSObject.h&gt;\r\n#import &lt;Foundation\/NSString.h&gt; \/\/or @class NSString;\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>#import &lt;Foundation\/Foundation.h&gt;\r\n<\/code><\/pre>\n<h2 id=\"toc_3\"><\/h2>\n<h2 id=\"toc_4\">Accessor Methods<\/h2>\n<p>\ud56d\uc0c1 \uc5d1\uc138\uc11c \uba54\uc18c\ub4dc\ub97c \uc0ac\uc6a9\ud558\ub77c. \ub2e8, initializer\ub791 dealloc\uc548\uc740 \ud53c\ud55c\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>- (void)myMethod {\r\n    \/\/ ...\r\n    [self setTitle:[NSString stringWithFormat:@\"Area: %1.2f\", [self area]]];\r\n    \/\/ ...\r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>- (void)myMethod {\r\n    \/\/ ...\r\n    self.title = [NSString stringWithFormat:@\"Area: %1.2f\", self.area];\r\n    \/\/ ...\r\n}\r\n<\/code><\/pre>\n<h2 id=\"toc_5\"><\/h2>\n<h2 id=\"toc_6\">Memory Management<\/h2>\n<p>ARC\ub97c \uc0ac\uc6a9\ud55c\ub2e4. ARC\uc740 Xcode 4.2(LLVM compiler 3.0)\ubd80\ud130 \uc9c0\uc6d0\ud55c\ub2e4. \uc77c\ubd80\uae30\ub2a5\uc740 \ucef4\ud30c\uc77c\ub7ec \ub9cc\uc73c\ub85c \ud574\uacb0\uc774 \uc548\ub418\uae30 \ub54c\ubb38\uc5d0 iOS5 \uc774\uc0c1\uc744 \uc9c0\uc6d0\ud574\uc57c \ud55c\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSMutableArray *array = [[NSMutableArray alloc] init];\r\n\/\/ Use the array\r\n[array release];\r\n\r\n\/\/ or \r\n\r\nNSMutableArray *array = [[[NSMutableArray alloc] init] autoelease];\r\n\/\/ Use the array\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSMutableArray *array = [NSMutableArray array];\r\n\/\/ Use the array\r\n<\/code><\/pre>\n<h2 id=\"toc_7\"><\/h2>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>id heisenObject = [[array objectAtIndex:n] retain];\r\n[array removeObjectAtIndex:n];\r\n\/\/ ...\r\n[heisenObject doSomething];\r\n[heisenObject release];\r\n\/\/ ...\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>id heisenObject = [array objectAtIndex:n];\r\n[array removeObjectAtIndex:n];\r\n\/\/ ...\r\n[heisenObject doSomething];\r\n\/\/ ...\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>- (void)takeLastNameFrom:(Person *)person {\r\n    NSString *oldLastname = [[self lastName] retain];\r\n    [self setLastName:[person lastName]];\r\n    NSLog(@\"Lastname changed from %@ to %@\", oldLastname, [self lastName]);\r\n    [oldLastName release];\r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>- (void)takeLastNameFrom:(Person *)person {\r\n    NSString *oldLastname = [self lastName];\r\n    [self setLastName:[person lastName]];\r\n    NSLog(@\"Lastname changed from %@ to %@\", oldLastname, [self lastName]);\r\n}\r\n<\/code><\/pre>\n<h2 id=\"toc_8\"><\/h2>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>CFUUIDRef cfUUID = CFUUIDCreate(NULL);\r\nNSString *noteUUID = (NSString *)CFUUIDCreateString(NULL, cfUUID);\r\nCFRelease(cfUUID);\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>CFUUIDRef cfUUID = CFUUIDCreate(NULL);\r\nNSString *noteUUID = (__bridge_transfer NSString *)CFUUIDCreateString(NULL, cfUUID);\r\nCFRelease(cfUUID);\r\n<\/code><\/pre>\n<h2 id=\"toc_9\"><\/h2>\n<h2 id=\"toc_10\">Properties<\/h2>\n<p><code>property<\/code>\uc120\uc5b8 \ubc0f \uad6c\ud604\uc5d0\uc11c\ub294 <code>synthesize<\/code>\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \uc778\uc2a4\ud134\uc2a4 \ubcc0\uc218\uc5d0 \uc9c1\uc811 \uc561\uc138\uc2a4\ub97c \ud558\uace0 \uc2f6\uc744 \ub54c\uc5d0\ub294 <code>@synthesize title = _title;<\/code>\ub85c \ud558\uc5ec <code>_title<\/code> \ubcc0\uc218\ub97c \uc0ac\uc6a9\ud55c\ub2e4. \uc774 \ub54c <code>_title<\/code> \uc740 \uc120\uc5b8\ud558\uc9c0 \uc54a\ub354\ub77c\ub3c4 \ucef4\ud30c\uc77c\ub7ec\uac00 \ucc98\ub9ac\ud574 \uc900\ub2e4. \ub610\ud55c, <code>@synthesize<\/code> \uc790\uccb4\ub97c \uc0dd\ub7b5\ud558\ub294 \uac83\ub3c4 \ubb34\ubc29\ud558\ub2e4(Xcode 4.4 &#8211; Apple LLVM 4.0 Compiler\ubd80\ud130 \uc9c0\uc6d0).<\/p>\n<p>\ud55c \uac00\uc9c0 \uc0dd\uac01\ud560 \uc810\uc73c\ub85c, \ubcc0\uc218 <code>_title<\/code>\ub97c \uc9c1\uc811 \ucc38\uc870\uc6a9, \ud504\ub85c\ud37c\ud2f0 <code>self.title = ...<\/code>(setter)\ub97c \uac12\uc744 \ubcc0\uacbd\uc6a9\uc73c\ub85c \uc0ac\uc6a9\ud560 \uc218 \uc788\uc74c\uff08initializer\uc640 dealloc\ub294 \ud53c\ud568)<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>@interface Thing : NSObject {\r\n  NSString *title;\r\n}\r\n- (NSString *)title;\r\n- (void)setTitle:(NSString *)newTitle;\r\n@end\r\n\r\n@implementation Thing\r\n- (NSString *)title {\r\n    return title;\r\n}\r\n- (void)setTitle:(NSString *)newTitle {\r\n    if (title != newTitle) {\r\n        [title release];\r\n        title = [newTitle copy];\r\n    }\r\n}\r\n@end\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@interface Thing : NSObject \r\n@property (copy) NSString *title;\r\n@end\r\n\r\n@implementation Thing\r\n@synthesize title;\r\n@end\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>@interface Thing : NSObject {\r\n    float radius;\r\n}\r\n- (float)radius;\r\n- (void)setRadius:(float)newValue;\r\n- (float)area;\r\n@end\r\n\r\n@implementation Thing\r\n- (float)radius {\r\n    return radius;\r\n}\r\n- (void)setRadius:(float)newValue {\r\n    radius = newValue;\r\n}\r\n- (float)area {\r\n    return M_PI * pow(radius, 2.0);\r\n}\r\n@end\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@interface Thing : NSObject\r\n@property float radius;\r\n@property (readonly, nonatomic) float area;\r\n@end\r\n\r\n@implementation Thing\r\n@synthesize radius;\r\n- (float)area {\r\n    return M_PI * pow(self.radius, 2.0)\r\n;}\r\n@end\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>@interface Thing : NSObject {\r\n    id delegate;\r\n}\r\n- (id)delegate;\r\n- (void)setDelegate:(id)newDelegate;\r\n@end\r\n\r\n@implementation Thing\r\n- (id)delegate {\r\n    return delegate;\r\n}\r\n- (void)setDelegate:(id)newDelegate {\r\n    delegate = newDelegate;\r\n}\r\n@end\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@interface Thing : NSObject\r\n@property (weak) id delegate;\r\n@end\r\n\r\n@implementation Thing\r\n@synthesize delegate;\r\n@end\r\n<\/code><\/pre>\n<h2 id=\"toc_11\">Private State<\/h2>\n<p>Private \ubcc0\uc218\ub294 \ud074\ub798\uc2a4 \uc775\uc2a4\ud150\uc158 \ub0b4\uc5d0 property\ub85c \uc120\uc5b8\ud55c\ub2e4. \uba54\uc18c\ub4dc\ub3c4 \ub9c8\ucc2c\uac00\uc9c0\ub85c \ud074\ub798\uc2a4 \uc775\uc2a4\ud150\uc158\uc744 \uc0ac\uc6a9\ud55c\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>@interface Thing {\r\n   BOOL privateTest;\r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@interface Thing ()\r\n@property BOOL privateTest;\r\n@end\r\n\/\/ ...\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>@interface Thing (PrivateMethods)\r\n- (void)doSomethingPrivate;\r\n- (void)doSomethingElsePrivate;\r\n@end\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@interface Thing ()\r\n- (void)doSomethingPrivate;\r\n- (void)doSomethingElsePrivate;\r\n@end\r\n<\/code><\/pre>\n<h2 id=\"toc_12\">Outlets<\/h2>\n<p>\uba54\ubaa8\ub9ac \uad00\ub9ac\ub97c \uc704\ud574 strong, weak\ub85c property\ub97c \uc120\uc5b8\ud55c\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>@interface MyViewController : MySuperclass {\r\n    IBOutlet ElementClass *uiElement;\r\n}\r\n@end\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@interface MyViewController : MySuperclass\r\n@property (weak) IBOutlet ElementClass *uiElement;\r\n@end\r\n<\/code><\/pre>\n<h2 id=\"toc_13\">Initializer Methods and dealloc<\/h2>\n<p>\ucd08\uae30\ud654\uc640 \ud574\uc81c\ub294 \uc561\uc138\uc11c\ub97c \uc4f0\uc9c0 \uc54a\uace0 \ubcc0\uc218\ub85c \ud55c\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>- (id)init {\r\n    if (self = [super init]) {\r\n        [self setTitle:@\"default\"];\r\n    }\r\n    return self;\r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>- (id)init {\r\n    self = [super init];\r\n    if (self) {\r\n        _title = @\"default\";\r\n    }\r\n    return self;\r\n}\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>- (void)dealloc {\r\n    [self setTitle:nil];\r\n    [super dealloc];\r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>- (void)dealloc {\r\n    [_title release];\r\n    [super dealloc];\r\n}\r\n<\/code><\/pre>\n<h2 id=\"toc_14\">Protocols<\/h2>\n<p>\ud544\uc218\ub294 \uc544\ub2cc \uad6c\ud604\ud558\uc9c0 \uc54a\uc740 \uba54\uc18c\ub4dc\uac00 \uc788\uae30 \ub54c\ubb38\uc5d0 id\ub97c \uadf8\ub300\ub85c \uc0ac\uc6a9\ud558\uc9c0 \ub9d0\uace0 optional\uc120\uc5b8\uc744 \uc0ac\uc6a9\ud574\uc11c id\ud615\uc5d0 \uc81c\ub300\ub85c protocol\uc744 \uc9c0\uc815\ud55c\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>@ButlerProtocol\r\n- (void)makeTea;\r\n- (void)serveSandwiches;\r\n- (void)mowTheLawn;\r\n@end\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@protocol ButlerProtocol &lt;NSObject&gt;\r\n- (void)makeTea;\r\n- (void)serveSandwiches;\r\n@optional\r\n- (void)mowTheLawn;\r\n@end\r\n<\/code><\/pre>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>- (id &lt;ButlerProtocol&gt;)butler;\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>@property id &lt;ButlerProtocol&gt; butler;\r\n<\/code><\/pre>\n<h2 id=\"toc_15\">Collections and Literals<\/h2>\n<p><code>@<\/code> \ub9ac\ud130\ub7f4 \uad6c\ubb38\uacfc <code>[]<\/code> \ucc38\uc870\uad6c\ubb38\uc740 Xcode 4.4(Apple LLVM 4.0 Compiler)\ubd80\ud130 \uc9c0\uc6d0\ud588\uc73c\ub098 iOS\uc5d0 \uc0ac\uc6a9\ud560 \uc218 \uc788\uac8c \ub41c\uac74 Xcode4.5 \ubd80\ud130\uc774\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSNumber *aNumber = [NSNumber numberWithFloat:2.3];\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSNumber *aNumber = @2.3f;\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSNumber *anotherNumber = [NSNumber numberWithFloat:x];\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSNumber *anotherNumber = @(x);\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSArray *anArray = [NSArray arrayWithObjects:aThing, @\"A String\",\r\n                       [NSNumber numberWithFloat:3.14], nil];\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSArray *anArray = @[ aThing, @\"A String\", @3.14 ];\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSDictionary *aDictionary = [NSDictionary dictionaryWithObjectsAndKeys:\r\n                                value, @\"Key\",\r\n                                [NSNumber numberWithBOOL:YES], @\"OtherKey\",                                nil];\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre><code>objectivec:afterNSDictionary *aDictionary = @{ @\"Key\" : value, @\"OtherKey\" : @YES };\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSDictionary *distanceDict = [NSDictionary dictionaryWithObjectsAndKeys:            [NSNumber numberWithDouble:  0.0], kCIAttributeMin,\r\n            [NSNumber numberWithDouble:  1.0], kCIAttributeMax,\r\n            [NSNumber numberWithDouble:  0.0], kCIAttributeSliderMin,\r\n            [NSNumber numberWithDouble:  0.7], kCIAttributeSliderMax,\r\n            [NSNumber numberWithDouble:  0.2], kCIAttributeDefault,\r\n            [NSNumber numberWithDouble:  0.0], kCIAttributeIdentity,\r\n            kCIAttributeTypeScalar,            kCIAttributeType,\r\n            nil];\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSDictionary *distanceDict = @{\r\n        kCIAttributeMin       : @0.0,\r\n        kCIAttributeMax       : @1.0,\r\n        kCIAttributeSliderMin : @0.0,\r\n        kCIAttributeSliderMax : @0.7,\r\n        kCIAttributeDefault   : @0.2,\r\n        kCIAttributeIdentity  : @0.0,\r\n        kCIAttributeType      : kCIAttributeTypeScalar\r\n};\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSDictionary *slopeDict = [NSDictionary dictionaryWithObjectsAndKeys:            [NSNumber numberWithDouble: -0.01], kCIAttributeSliderMin,\r\n            [NSNumber numberWithDouble:  0.01], kCIAttributeSliderMax,\r\n            [NSNumber numberWithDouble:  0.00], kCIAttributeDefault,\r\n            [NSNumber numberWithDouble:  0.00], kCIAttributeIdentity,\r\n            kCIAttributeTypeScalar,             kCIAttributeType,\r\n            nil];\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSDictionary *slopeDict = @{\r\n        kCIAttributeSliderMin : @-0.01,\r\n        kCIAttributeSliderMax : @0.01,\r\n        kCIAttributeDefault   : @0.00,\r\n        kCIAttributeIdentity  : @0.00,\r\n        kCIAttributeType      : kCIAttributeTypeScalar };\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>id firstElement = [anArray objectAtIndex:0];\r\n[anArray replaceObjectAtIndex:0 withObject:newValue];\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>id firstElement = anArray[0];\r\nanArray[0] = newValue;\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>id value = [aDictionary objectForKey:@\"key\"];\r\n[aDictionary setObject:newValue forKey:@\"key\"];\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>id value = aDictionary[@\"key\"];\r\naDictionary[@\"key\"] = newValue;\r\n<\/code><\/pre>\n<hr \/>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSArray *array = ...;\r\nint i;\r\nfor (i = 0; i &lt; [array count]; i++) {\r\n    id element = [array objectAtIndex:i];\r\n    \/\/ ... \r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSArray *array = ...;\r\nfor (id element in array) {\r\n     \/\/ ...\r\n}\r\n<\/code><\/pre>\n<h2 id=\"toc_16\">Blocks<\/h2>\n<h3 id=\"toc_17\">NSArray<\/h3>\n<p>\uc815\ub82c\uc740 <code>(NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr<\/code>\ub97c \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSArray *array = ...;\r\nNSArray *sortedArray;\r\nsortedArray = [array sortedArrayUsingFunction:MySort context:NULL];\r\n\r\nNSInteger MySort(id num1, id num2, void *context) {\r\n    NSComparisonResult result;\r\n    \/\/ Do comparison\r\n    return result;\r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSArray *array = ...;\r\nBOOL reverse = ...;\r\nNSArray *sortedArray;\r\nsortedArray = [array sortedArrayUsingComparator:^(id num1, id num2) {\r\n    NSComparisonResult result;\r\n    \/\/ Do comparison\r\n    return result;\r\n}];\r\n<\/code><\/pre>\n<h2 id=\"toc_18\"><\/h2>\n<p>each\ub294 <code>(void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx, BOOL *stop))block<\/code>\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>NSArray *array = ...;\r\nfor (id element in array) {\r\n    \/\/ ... \r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>NSArray *array = ...;\r\n[array enumerateObjectsUsingBlock:\r\n      ^(id obj, NSUInteger idx, BOOL *stop) {\r\n      \/\/ ...\r\n      NSLog(@\"Processing %@ at index %d\u201d, obj, idx);\r\n      \/\/ ...\r\n}];\r\n<\/code><\/pre>\n<h2 id=\"toc_19\"><\/h2>\n<h3 id=\"toc_20\">NSDictionary<\/h3>\n<p><code>(void)enumerateKeysAndObjectsUsingBlock:(void (^)(id key, id obj, BOOL *stop))block<\/code>\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre><code class=\":before\">NSDictionary *dictionary = ...;\r\nfor (NSString *key in dictionary) {\r\n    id object = [dictionary objectForKey:key];\r\n    \/\/ Do things with key and object.\r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre><code class=\":after\">NSDictionary *dictionary = ...;\r\n[dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id object, BOOL *stop) {\r\n    \/\/ Do things with key and object.\r\n}];\r\n<\/code><\/pre>\n<h2 id=\"toc_21\"><\/h2>\n<h3 id=\"toc_22\">Notifications<\/h3>\n<p><code>(id)addObserverForName:(NSString *)name object:(id)obj queue:(NSOperationQueue *)queue usingBlock:(void (^)(NSNotification *note))block<\/code>\uc744 \uc0ac\uc6a9\ud560 \uc218 \uc788\ub2e4.<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"before\"><code>- (void)registerForNotifications {\r\n    NSNotificationCenter *center = ...\r\n    [center addObserver:self\r\n        selector:@selector(windowBecameKey:)\r\n        name:NSWindowDidBecomeKeyNotification\r\n        object:self.window];\r\n}\r\n\/\/ Different context\r\n\/\/ No queue information\r\n- (void)windowBecameKey:(NSNotification *)notification {\r\n    \/\/ Get contextual information.\r\n}\r\n<\/code><\/pre>\n<p>\u2193<\/p>\n<pre class=\"lang:objectivec decode:true\" title=\"after\"><code>- (void)registerForNotifications {\r\n    NSNotificationCenter *center = ...\r\n    MyClass *__weak weakSelf = self;\r\n    [center addObserverForName:NSWindowDidBecomeKeyNotification\r\n        object:self.window\r\n        queue:[NSOperationQueue mainQueue]\r\n        usingBlock:^(NSNotification *) {\r\n            \/\/ ...\r\n            [weakSelf doSomething];\r\n            \/\/ ...\r\n    }];\r\n}\r\n<\/code><\/pre>\n<p>Blosks\ub0b4\uc5d0\uc11c self\ub294 \uc9c1\uc811 \ucc38\uc870 \ub418\uc9c0 \uc54a\uace0 \uc57d\ud55c\ucc38\uc870 <code>MyClass *__weak<\/code>\uc73c\ub85c \ubcc0\ud658\ud574\uc11c \uc0ac\uc6a9\ud574\uc57c \ud55c\ub2e4.<\/p>\n<h2 id=\"toc_23\"><\/h2>\n<h2 id=\"toc_24\">\uae30\ud0c0<\/h2>\n<ul>\n<li>\uc6d0\ub798 \uc790\ub8cc\ub294 <a href=\"https:\/\/developer.apple.com\/library\/mac\/navigation\/index.html\">Mac Developer Library<\/a> <strong>modern<\/strong>\uc73c\ub85c \uac80\uc0c9<\/li>\n<li>\uc0ac\uc6a9\ud558\uace0 \uc2f6\uc740 \uba54\uc18c\ub4dc\uac00 \ube14\ub7ed\uc5d0 \ub300\uc751\ub418\uc9c0 \uc54a\ub294 \uacbd\uc6b0 \u2192 <a href=\"https:\/\/github.com\/pandamonia\/BlocksKit\">BlocksKit<\/a>\uc758 \uc774\uc6a9\uc744 \uac80\ud1a0<\/li>\n<li>Xcode(\ucef4\ud30c\uc77c\ub7ec) \uc5c5\ub370\uc774\ud2b8 \uc815\ubcf4\ub294 <a href=\"https:\/\/developer.apple.com\/library\/mac\/documentation\/DeveloperTools\/Conceptual\/WhatsNewXcode\/00-Introduction\/Introduction.html\">What\u2019s New in Xcode<\/a>\ub97c \ucc38\uace0<\/li>\n<li>Xcode\uc5d0 modern Objective-C\ub85c \ubcc0\ud658\ud558\ub294 \uae30\ub2a5\uc744 \uc81c\uacf5\ud568 (Edit &gt; Covert &gt; To Modern Objective-C Syntax&#8230; \uc0ac\uc6a9. Xcode8.2.1 \uae30\uc900)<\/li>\n<\/ul>\n<h2>\ucc38\uace0\uc790\ub8cc<\/h2>\n<p>[1] TIOBE Index for December 2016(2017-01-08 04:12 KST \ud655\uc778), http:\/\/www.tiobe.com\/tiobe-index\/<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\uc54c\ub9bc \uc774 \uae00\uc740 Qiita\uc5d0 \uac8c\uc2dc\ub41c &#8220;Modern Objective-C \u30d3\u30d5\u30a9\u30fc\u30a2\u30d5\u30bf\u30fc&#8221;(http:\/\/qiita.com\/makoto_kw\/items\/d86fada0e38e9245912a\u00a0, 2014-04-16 \uc218\uc815\ubcf8 \uae30\uc900), makoto_kw\ub2d8\uc774 \uc791\uc131\ud55c \uae00\uc744 \ubc88\uc5ed\ud55c \uac83\uc785\ub2c8\ub2e4. Objective-C \uc5b8\uc5b4\ub294<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"advanced_seo_description":"","jetpack_seo_html_title":"","jetpack_seo_noindex":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":true,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[136],"tags":[383,379,377,371,367,375,373,381,369],"class_list":["post-689","post","type-post","status-publish","format-standard","hentry","category-osx","tag-convert","tag-ios","tag-language","tag-modern-objective-c","tag-objective-c","tag-syntax","tag--c","tag-381","tag-c"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p8gT1J-b7","_links":{"self":[{"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/posts\/689","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/comments?post=689"}],"version-history":[{"count":6,"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/posts\/689\/revisions"}],"predecessor-version":[{"id":696,"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/posts\/689\/revisions\/696"}],"wp:attachment":[{"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/media?parent=689"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/categories?post=689"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.jinukbaek.com\/blog\/wp-json\/wp\/v2\/tags?post=689"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}