`
啸笑天
  • 浏览: 3434862 次
  • 性别: Icon_minigender_1
  • 来自: China
社区版块
存档分类
最新评论

xcode4.5(iOS 6)开发与之前的差异

阅读更多

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英寸屏幕进行适配,需要创建一张Default-568h@2x.png图片,系统根据是否有此资源来识别是否

支持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声明,然后就可以在里面写私有方法声明,避免编译器乱提示警告。

 

-----------切糕分割线------------------

慢慢整理待续

分享到:
评论

相关推荐

    XCode的iOS11.0开发包

    XCode的iOS11.0开发包,XCode的iOS11.0开发包,XCode的iOS11.0开发包,XCode的iOS11.0开发包,XCode的iOS11.0开发包

    Xcode配置iOS16.0开发包DeviceSupport

    将Xcode适配可以调试、编译、运行、打包系统版本号为iOS 16.0 版本的设备,解决"Could not find Developer Disk Image"问题

    xcode配置iOS10.3开发包

    xcode配置iOS10.3开发包 解决iOS 10.3升级后无法真机测试 Could not find Developer Disk Image

    macos-lion-dp4-10.8+ios6+xcode4.5.zip

    macos-lion-dp4-10.8+ios6+xcode4.5.zip 含wifi,ipad,iphone等等全套bt种子

    xcode支持iOS15.2和iOS15.4

    xcode支持iOS15.2和iOS15.4

    Xcode 配置iOS 13.1 开发包.zip

    Xcode 配置iOS 13.1 开发包.zip

    IOS 精选源码之 下拉刷新 已封装好,更新到xcode4.5

    下拉刷新 ios开发常用代码 已经封装好,更新到xcode4.5 有例子

    Xcode iOS 16真机调试包 开发调试

    Xcode iOS 16真机调试包 开发调试 iOS16适配

    Xcode4.5缺少的DevToolCore.framework

    Xcode4.5缺少的DevToolCore.framework,老版本Xcode4.5中拷贝出来的。考虑到有朋友没有备份老版本Xcode,单独考出这个文件,解决PBXCP报错。 将这个文件解压放到报错提示的位置即可(/Contents/Developer/Library/...

    xcode配置iOS 12.1 开发包

    将Xcode适配可以调试、编译、运行、打包系统版本号为iOS 12.1 版本的设备,解决"Could not find Developer Disk Image"问题 使用详情 请前往https://blog.csdn.net/u010731949/article/details/52576792

    xcode配置iOS12开发包

    xcode配置iOS12开发包, 解决could not find developer disk image问题。用法:shift+command+G,前往/Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport添加进去重启Xcode。

    xcode配置iOS 10.3开发包

    将Xcode适配可以编译iOS 10.3版本的设备

    Xcode配置iOS15.5开发包DeviceSupport

    将Xcode适配可以调试、编译、运行、打包系统版本号为iOS 15.5 版本的设备,解决"Could not find Developer Disk Image"问题

    Xcode配置iOS14.4开发包DeviceSupport

    将Xcode适配可以调试、编译、运行、打包系统版本号为iOS 14.4 版本的设备,解决"Could not find Developer Disk Image"问题 使用详情 请前往https://blog.csdn.net/u010731949/article/details/52576792

    Xcode配置iOS15.6开发包DeviceSupport

    将Xcode适配可以调试、编译、运行、打包系统版本号为iOS 15.6 版本的设备,解决"Could not find Developer Disk Image"问题

    xcode配置iOS 12.4 开发包

    将Xcode适配可以调试、编译、运行、打包系统版本号为iOS 12.4 版本的设备,解决"Could not find Developer Disk Image"问题 使用详情 请前往https://blog.csdn.net/u010731949/article/details/52576792

    xcode适配iOS14.1开发真机包

    xcode适配iOS14.1开发真机包, 解决could not find developer disk image问题, 或者“ iPhone is not availabel, please reconnect the device”问题。 用法:shift+command+G,前往/Applications/Xcode.app/...

    xcode配置iOS 13.2 开发包

    将Xcode适配可以调试、编译、运行、打包系统版本号为iOS 13.2 版本的设备,解决"Could not find Developer Disk Image"问题 使用详情 请前往https://blog.csdn.net/u010731949/article/details/52576792

    IOS11SDK xcode8调试IOS11

    xcode8调试IOS11 Shift+Command+G进入 /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/DeviceSupport 把解压后的文件复制进去。

Global site tag (gtag.js) - Google Analytics