@synthesize by default(属性自动绑定)在 xcode4.4以前,当我们想为类添加一个新的属性,一般都要对应写实例变量和相应的synthesis,但是在Xcode 4.4之后,synthesis现在会对应property自动生成。默认行为下,对于属性foo,当开发者没有写相应的synthesis的时候,编译 器会自动在实现文件中为开发者补全synthesis,就好像你写了@synthesis foo = _foo。
总结一下,新的属性绑定规则如下:
● 除非开发者在实现文件中提供getter或setter,否则将自动生成
● 除非开发者同时提供getter和setter,否则将自动生成实例变量
● 只要写了synthesis,无论有没有跟实例变量名,都将生成实例变量
● 如开发者写了@synthesize foo;那么实例变量名就是foo
● dynamic优先级高于synthesis
● 对于写了@dynamic的实现,所有的对应的synthesis都将不生效
@literals(简写)
在xcode4.4以前
NSNumber
所有的[NSNumber numberWith…:]方法都可以简写了:
● [NSNumber numberWithChar:‘X’]简写为 @‘X’;
● [NSNumber numberWithInt:12345] 简写为 @12345
● [NSNumber numberWithUnsignedLong:12345ul] 简写为 @12345ul
● [NSNumber numberWithLongLong:12345ll] 简写为 @12345ll
● [NSNumber numberWithFloat:123.45f] 简写为 @123.45f
● [NSNumber numberWithDouble:123.45] 简写为 @123.45
● [NSNumber numberWithBool:YES] 简写为 @YES
NSDictionary
● [NSDictionary dictionary] 简写为 @{}
● [NSDictionary dictionaryWithObject:o1forKey:k1] 简写为 @{ k1 : o1 }
● [NSDictionarydictionaryWithObjectsAndKeys:o1, k1, o2, k2, o3, k3, nil] 简写为 @{ k1 : o1, k2 : o2, k3 : o3 }
当写下@{ k1 : o1, k2 : o2, k3 : o3 }时,实际的代码会是
// compiler generates:
id objects[] = { o1, o2, o3 };
id keys[] = { k1, k2, k3 };
NSUInteger count = sizeof(objects) / sizeof(id);
dict = [NSDictionary dictionaryWithObjects:objects forKeys:keyscount:count];
NSArray
部分NSArray方法得到了简化:
● [NSArray array] 简写为 @[]
● [NSArray arrayWithObject:a] 简写为 @[ a ]
● [NSArray arrayWithObjects:a, b, c, nil] 简写为 @[ a, b, c ]
比如对于@[ a, b, c ],实际编译时的代码是
// compiler generates:
id objects[] = { a, b, c };
NSUInteger count = sizeof(objects)/ sizeof(id);
array = [NSArray arrayWithObjects:objectscount:count];
Mutable版本和静态版本
上面所生成的版本都是不可变的,想得到可变版本的话,可以对其发送-mutableCopy消息以生成一份可变的拷贝。比如
NSMutableArray *mutablePlanets = [@[
@"Mercury", @"Venus",
@"Earth", @"Mars",
@"Jupiter", @"Saturn",
@"Uranus", @"Neptune" ]
mutableCopy];
另外,对于标记为static的数组,不能使用简写为其赋值(其实原来的传统写法也不行)。
如果直接赋值就会提示出错
@implementation MyClass
static NSArray * thePlanets = @[ error:array literals not constant
@"Mercury", @"Venus", @"Earth",
@"Mars", @"Jupiter", @"Saturn",
@"Uranus", @"Neptune"
];
解决方法是在类方法+ (void)initialize中对static进行赋值。
@implementation MyClass
static NSArray *thePlanets;
+ (void)initialize{
if (self == [MyClass class]) {
thePlanets = @[ @"Mercury", @"Venus", @"Earth", @"Mars", @"Jupiter", @"Saturn", @"Uranus", @"Neptune" ];
}
}
下标
Array
Song *oldSong = [_songs objectAtIndex:idx];
[_songs replaceObjectAtIndex:idx withObject:newSong];
可以简写为
Song *oldSong = _songs[idx];
_songs[idx] = newSong;
Dictionary
id oldObject = [_storage objectForKey:key];
[_storage setObject:newobject forKey:key];
可以简写为id oldObject = _storage[key];
_storage[key] = newObject;
对于我们自定义的类,只需要实现一下的方法就能使用下标访问。
Array
- (elementType)objectAtIndexedSubscript:(indexType)idx;
- (void)setObject:(elementType)object atIndexedSubscript:(indexType)idx;
Dictionary
- (elementType)objectForKeyedSubscript:(keyType)key;
- (void)setObject:(elementType)object forKeyedSubscript:(keyType)key;
Segues
xcode 4.5的storyboard提供了更方便的segue方法。
当你要实现按cell中的箭头实现segue时。以往都要用代码来实现。xcode4.5中提供了直接在storyboard中链接的方法
Unwind Segues
有了Unwind segues,你可以很容易就实现segue到你制定的一个View上。
你要在制定目标的controller中实现以下两个方法。
-(BOOL)canPerformUnwindSegueAction:(SEL)action fromViewController:(UIViewController *)fromViewController withSender:(id)sender
{
return YES;
}
(默认YES)
- (IBAction)done:(UIStoryboardSegue *)segue
{
// React to the impending segue
// Pull state back, etc.
}
CollectionView
下面这幅图就是用Collection Views实现的一个照片墙显示。
类似于瀑布流的展示方法。
为什么要使用Collection Views呢?
■
可以高度定制内容的展现
■
管理数据最佳的做法
■ 即使是处理大量数据,也非常的高效
对于CollectionView主要要实现的方法有三个
UICollectionViewDataSource
●section的数量
-numberOfSectionsInCollection:
●某个section里有多少个item
-collectionView:numberOfItemsInSection:
●对于某个位置应该显示什么样的cell
-collectionView:cellForItemAtIndexPath:
embed segue
在以往的xcode中,如果我们想要添加一个子视图,我们需要用代码实现。
UIViewController *child =
[[self storyboard] instantiateViewControllerWithIdentifier:@"ContentScene"];
[self addChildViewController:child];
[[self view] addSubview:[child view]];
[[child view] setFrame:frame];
现在在storyboard多了container view这个控件,可以让你不用代码实现添加一个子视图。
你可以在
- (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
中实现参数的传递。
方法顺序
如果有以下代码:
@interface SongPlayer : NSObject
- (void)playSong:(Song *)song;
@end
@implementation SongPlayer
- (void)playSong:(Song *)song {
NSError *error;
[self startAudio:&error];
...
}
- (void)startAudio:(NSError **)error { ... }
@end
在早一些的编译环境中,上面的代码会在[self startAudio:&error]处出现一个实例方法未找到的警告。由于编译顺序,编译器无法得知在-playSong:方法之后还有一个-startAudio:,因此给出警告。
在新编译器里,如果在同一实现文件中,无论方法写在哪里,编译器都可以在对方法实现进行编译前知道所有方法的名称,从而避免了警告。
枚举改进
从Xcode4.4开始,有更好的枚举的写法了:
typedef enum NSNumberFormatterStyle : NSUInteger {
NSNumberFormatterNoStyle,
NSNumberFormatterDecimalStyle,
NSNumberFormatterCurrencyStyle,
NSNumberFormatterPercentStyle,
NSNumberFormatterScientificStyle,
NSNumberFormatterSpellOutStyle
} NSNumberFormatterStyle;
. Maps
替换Google Map为苹果自行研发3D地图
2. Social Network
集成新浪微博,Facebook , Twitter等社交网络帐号管理。 < Social.framework >
3. Pass Kit
提供通行证SDK,可以此为基础开发电子通行证甚至实体物理票务。
4. Game Center
可调用GKChallenge函数发起游戏挑战;authenticateHandler保存服务端验证信息;支持超时设置;GKAchievement可同时提交多个成就信息。
5. Reminder
Event Kit framework提供可定制提醒服务。
6. In-App Purchase(内置商店):
支持可下载商品,苹果将提供相应服务端存储。 < SKDownload class - StoreKit.framework >
7. Collection Views
新增UICollectionViewController,支持更便捷的自定义Layout。
8. UI State Preservation (界面状态保留)
IOS6.0中,State preservation提供保存界面状态方案。这样即使应用进程被结束,重新打开时仍可让用户感觉界面没有变化。
9. Auto Layout
以“springs and struts”Model 为基础的自动布局,用于:
a. 本地化
b. 支持right-to-left 语言
c. 更好的管理view与controller
10. Data Privacy (数据隐私中心)
a. 通讯录
b. 日历
c. 提醒
d. 相册
第三方应用访问以上项目前,用户将被提示授权。Info.plist可定制访问这些项目时给用户的描述。
Note:应用若被拒绝授权,将收到Null数据,须做好相应流程管理。
Additional Framework Enhancements ( 框架增强 )
一. UIKit Framework:
UIImage:新初始化方法,可设置scale参数
支持自定义界面: UIBarButtonItem, UIPageControl, UIPageViewController, UISwitch, and UIStepper
UITableView:新成员变量UITableViewHeaderFooterView来设置header, footer
UITableViewController:支持内置刷新按钮-UIRefreshControl
UIWebView:提供禁止访问额外隐藏内容的方法
**UIViewController:
全新的更简洁的屏幕旋转管理方法 (极度坑爹,跟原先完全不同)
UINavigationBar:可subclass了..
二. OpenGL ES:
GL_EXT_texture_storage, GL_APPLE_copy_texture_levels, GL_APPLE_map_buffer_range, GL_APPLE_sync, GL_APPLE_shader_framebuffer_fetch
三. Media Player Framework
增加MPVolumeView:用于自定义音量条
四. Image IO Framework:
可查询EXIF及IPTC,得到图片的拍摄信息 (光圈,焦距,曝光时间) (相关类:CGImageSourceRef, CGImageDestinationRef)
五. iAd Framework
广告Banner支持一个在iPad上的新尺寸。
六. Foundation Framework:
1. NSFileManager:支持云管理
2. NSUUID类:支持开发者自行生成需要的UUID
3. NSURLRequest:允许开发者设定某request在多元网络环境下是否被允许。
4. NSString 新增转大小写的方法,哦耶~
七. External Accessory Framework:
新增一个华丽丽管理蓝牙设备连接的界面:显示可用蓝牙设备列表。
八. Event Kit Framework:
优化提醒,日历管理。
九. Core Video Framework:
支持2种新像素级格式,以提供OpenGL ES相关更高效的one-channel, two-channel图像存储。
十. Core Media Framework
新增CMClockRef, CMTimebaseRef类型。
十一. Core Location Framework (地理位置框架)
1. 当用户在指定时间内未移动,通过设置pausesLocationUpdatesAutomatically来暂停地理位置传送,以节省电量。
2. 设置 activityType来区分driving usage 和 fitness usage
十二. Core Bluetooth Framework
蓝牙设备支持外围模式(peripheral mode), 之前只支持中心模式(central mode)。
十三. Core Audio
1. AUDeferredRenderer音频单元,允许以低优先级线程模式,进行更频繁的音频切片。
2. AudioQueueProcessingTap:允许截获音频队列上的数据,并处理它,你懂的^^。
十四. AV Foundation Framework
AVPlayer更好的支持网络流媒体 etc..
十五. Ad Support Framework
提供用于标识App广告客户端的新方案(干掉UDID后的新招,貌似CFUUID)。
十六. Accelerate Framework
新增vDSP, SSE, etc ..