1.
开发iphone5和ios6版本最低需要使用xcode4.5,而xcode4.5不再支持armv6即:iOS4.3.3以下的系统.
不被支持的硬件设备包括:iPod 2nd gen, iPhone 3G 或更老的iPhone
例如我打包时的错误提示就是:
warning: iOS deployment targets lower than 4.3 are not supported (current
IPHONEOS_DEPLOYMENT_TARGET = "4.0", ARCHS = "armv7").
(null): iPhone/iPod Touch: application executable is missing a required
architecture. At least one
of the following architecture(s) must be
present: armv6 (-19033)
2.
适配4英寸屏幕适配
旧应用要与4英寸屏幕进行适配,需要创建一张[email protected]图片,系统根据是否有此资源来识别是否
支持4英寸屏幕。至于其他资源不允许使用xxx-568h.jpg此格式来适配屏幕,需要使用代码对屏幕进行检测来分别
进行适配。
一般用于判断iphone5的代码:
#define iPhone5 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(640,1136),[[UIScreen mainScreen] currentMode].size) : NO)
#define iPhone5_0 ([UIScreen instancesRespondToSelector:@selector(currentMode)] ? CGSizeEqualToSize(CGSizeMake(320,568), [[UIScreen mainScreen] currentMode].size) : NO)
为什么要写2个呢,这并不是没有作用的,如果代码写界面的话,在iPhone5下View的高是568,也就是判断的时候
用的宏是第二个,最好是把这2个宏写在项目的XXX-Prefix.pch这个文件里面。
3.
ios6转屏问题,控制视图的旋转
4.
UINavigationViewController的变化
在开发过程中发现的,该类的initWithRootViewController在之前的版本是最终会调用到init方法的。
因此在继承UINavigationViewController时,直接在重写init方法来初始化对象所需属性即可。
但是在iOS6上是不会调用init方法,因此需要开发者们注意。
5.
CFRelease的变化
在之前版本中如果CFRelease传入nil是被允许的,这也符合我们传入nil对象不会对我们的程序造成影响,但是在iOS6中,
这样的写法程序就
直接把你的程序Crash掉了,所以代码中还是需要判断一下是否为nil才是安全的做法。
6.
UIPickerView的变化
在之前版本中调用[_pickerView selectRow:-1 inComponent:0 animated:YES];是允许的。但在
iOS6中会导致崩溃。
7.
UIActivityIndicatorView的变化
在之前的版本中假如调用了startAnimating方法之后,只要把UIActivityIndicatorView添加到子视图中
就会显示加载动画,但在iOS6只要移出显示队列则会停止动画,特别在UITableViewCell中加入此控件,
只要滚动几下
Cell的 UIActivityIndicatorView就消失了, 为解决此问题可以在加入显示队列时根据
isAnimating属性来判断是否执行动画, 如果没有则重新调用一下startAnimating方法。
for (UIView *_curView in cell.subviews) {
if ([_curView isKindOfClass:[UIActivityIndicatorView class]]) {
[(UIActivityIndicatorView *)_curView startAnimating];
break;
}
}
8
通讯录列表获取差异
ABAddressBookRef addressBook = nil; if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) { addressBook = ABAddressBookCreateWithOptions(NULL, NULL); //等待同意后向下执行 dispatch_semaphore_t sema = dispatch_semaphore_create(0); ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error) { dispatch_semaphore_signal(sema); }); dispatch_semaphore_wait(sema, DISPATCH_TIME_FOREVER); dispatch_release(sema); } else { addressBook = ABAddressBookCreate(); } NSArray *personArray = (NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);
9.
由于ios6中,把viewDidUnLoad这个函数给撤销了,详见:http://justsee.iteye.com/admin/blogs/1820588
10
以前属性是objective-C的一个新机制,并且要求必须声明与之对应的实例变量,例如
@interface MyViewController: UIViewController { UIButton *myButton; IBOutlet UIButton *myButton2; } @property (strong, nonatomic) UIButton *myButton; @property (strong, nonatomic) UIButton *myButton2; @end
现在不需要为属性声明实例变量了,IBOutlet关键字移到了属性声明中了,例如:
@interface MyViewController: UIViewController @property (strong, nonatomic) UIButton *myButton; @property (strong, nonatomic) UIButton *myButton2; @end
11
@synthesize by default(属性自动绑定)在xcode4.5以前,当我们想为类添加一个新的属性,一般都要对应写实例变量和相应的synthesis,但是在Xcode 4.5,synthesis现在会对应property自动生成。默认行为下,对于属性foo,当开发者没有写相应的synthesis的时候,编译器会自动在实现文件中为开发者补全synthesis,就好像你写了@synthesis foo = _foo。
总结一下,新的属性绑定规则如下:
● 除非开发者在实现文件中提供getter或setter,否则将自动生成
● 除非开发者同时提供getter和setter,否则将自动生成实例变量
● 只要写了synthesis,无论有没有跟实例变量名,都将生成实例变量 。 如开发者写了@synthesize foo;那么实例变量名就是foo
● dynamic优先级高于synthesis 。对于写了@dynamic的实现,所有的对应的synthesis都将不生效
12
@literals
@除了可以表示NSString对象外。现在还可以表示数字、数组、字典、和表达式
NSString * string = @"a string object";
NSNumber * numberFromNumber= @12;
NSNumber * numberFromExpression= @(20 + 40);
NSArray * array = @[obj1, obj2]; //注意上面不再需要nil结尾
NSDictionary * dictionary = @{@"key1" : value1, @"key2" : value2}; //上面也不再需要了,而且key在value前面了。
然后就是这些东西可以互相嵌套,比如
NSArray * array = @[@{@"name" : @"Bacon", @"age" : @12}, @{@"name" : @"Dave", @"age" : @14}];
13
NSArray 和 NSDictionary 可以使用[]语法了
现在可以直接写:
id firstElement = anArray[0];
anArray[0] = newValue;
替代以前的
id firstElement = [anArray objectAtIndex:0];
[anArray replaceObjectAtIndex:0 withObject:newValue];
用
id value = aDictionary[@"key"];
aDictionary[@"key"] = newValue;
替代以前的
id value = [aDictionary objectForkey:@"key"];
[aDictionary setObject:newValue forKey:@"key"];
14
在.m自己用的“私有”消息可以不用ClassExtension表达了。
想在.m文件里添加自己的一些消息而不在.h文件里出现,可以在最近的ClassExtension语法里表达如下@interface AClass ()
- (void) privateMethod;
@end
@implement AClass
- (void) privateMethod{ }
@end
现在 可以直接在.m文件里写,而编译器不会出现警告此方法未声明
@implement AClass
- (void) privateMethod{ }
@end
如果不知道ClassExtension语法的, 我只想说,ClassExtension是类似Category语法的东西,在.m文件内添加一个无名的Category的@interface声明,然后就可以在里面写私有方法声明,避免编译器乱提示警告。
-----------切糕分割线------------------
慢慢整理待续