执行sudo gem install cocoapods出现错误

ERROR:  While executing gem … (Errno::EPERM)
Operation not permitted – /usr/bin/xcodeproj

这个问题在stackoverflow上面有过讨论:

Can not perform pod install under el capitan (15A279b)
http://stackoverflow.com/questions/32810808/can-not-perform-pod-install-under-el-capitan-15a279b

http://stackoverflow.com/questions/30812777/cannot-install-cocoa-pods-after-uninstalling-results-in-error/30851030#30851030

被采纳的答案为:sudo gem install -n /usr/local/bin cocoapods

As it has been pointed out below, this is a cleaner way of doing it, instead of getting around the Security features of OS X.

sudo gem install -n /usr/local/bin cocoapods

libxml2.dylb 添加后 引用不了

XCODE ,  Project -> Edit Project Settings -> Build You need to add “/usr/include/libxml2″ to the “Header Search Paths” and you need to add “-lxml2″ to the “Other Linker Flags”.

IOS ARC 和MRC 混编译的方法

I have got the solution, i needed to add the right flags to the compiler flags for each file which doesn’t support the ARC. For me, i use Xcode 4.2, so under target -> Build Phases -> Compile Sources, double click on the file you want to disable the ARC feature and put -fno-objc-arc the click on Done. And it’s Done ;)
Please note, that if the file doesn’t exist on the list, you can just add it by clicking the + button and then perform the same work above.

iOS中retain和copy的区别

原来简单解释过属性定义(Property) ,并且提起了简单的retain,copy,assign的区别。那究竟是有什么区别呢?

assign就不用说了,因为基本上是为简单数据类型准备的,而不是NS对象们。

Retain vs. Copy!!

copy: 建立一个索引计数为1的对象,然后释放旧对象
retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1
那上面的是什么该死的意思呢?

Copy其实是建立了一个相同的对象,而retain不是:

比如一个NSString对象,地址为0×1111,内容为@”STR”

Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化

retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1

也就是说,retain是指针拷贝,copy是内容拷贝。

iPhone使用CoreTelephony获得SIM卡网络运营商名称

注意要加头文件目录 /System/Library/Frameworks/CoreTelephony.framework/Headers 到 build 设置 Header Search Paths,并在使用到这些类中加头文件,例如
1. #import “CTCarrier.h”
2. #import “CTTelephonyNetworkInfo.h”


iOS 4.0 的官方 API 里头,多了一个叫做 Core Telephony 的 framework;一直以来 Core Telephony 都是 private API,现在开放出来,但是从文件来看,里头根本没有几行,既没有告诉你应该怎么用,也没有范例,你从 framework 里头寥寥四个 class 的 header 中,也搞不清楚,究竟可以把这个东西用在什么用途上。

目前只知道可以拿来做两件事情:1. 知道目前你这只 iPhone 用的是哪个电信商的服务;2. 知道现在 iPhone 是不是在打电话。

※ 电信商资讯

用 CTTelephonyNetworkInfo 与 CTCarrier 这两个 class,就可以取得电信商资讯,例如:

CTTelephonyNetworkInfo *info = [[CTTelephonyNetworkInfo alloc] init];
CTCarrier *carrier = info.subscriberCellularProvider;
NSLog(@”carrier:%@”, [carrier description]);

倒出来的结果像是:

CTCarrier (0x140dc0) {
Carrier name: [中华电信]
Mobile Country Code: [466]
Mobile Network Code:[92]
ISO Country Code:[tw]
Allows VOIP? [YES]
}

然后,如果你对 CTTelephonyNetworkInfo 喂一个 block 进去,像是:

info.subscriberCellularProviderDidUpdateNotifier = ^(CTCarrier *carrier) {NSLog(@”carrier:%@”, [carrier description]);};

如 此一来,当你的 iPhone 漫游到了其他网路的时候,就会执行你这段 block,但光是知道手机现在漫游在哪个电信商的网路里头,大概能做的,就是一些跟电信商关系密切的服务之类,你或许可以决定软体里头有哪些功能,一定 要在某个电信商的网路才能用;电信商自己做 iPhone 软体的时候大概会想做这种事情。
※ 通话资料

用 CTCallCenter 与 CTCall 这两个 class,便可以知道目前 iPhone 是否在通话中。CTCallCenter 的用途是用来监控是不是有电话打进来、正在接听、或是已经挂断,而 CTCall 则是将每一则通话事件包装成一个物件。我们先写一小段程式-

CTCallCenter *center = [[CTCallCenter alloc] init];
center.callEventHandler = ^(CTCall *call) {
NSLog(@”call:%@”, [call description]);
};

然后,在实机上执行,接著打通电话到这支 iPhone 上,打通电话进去,然后马上挂断(人好端端的,干嘛为了测试程式跟自己的电话费帐单过不去呢?)就可以看到 iPhone 执行了我们的 block,把 CTCall 物件倒出来:

CTCall (0x143400) {
callState: [CTCallStateIncoming]
Call ID: [CE5F9337-1990-4254-8797-1CCEA85B061B]
}
CTCall (0x10bac0) {
callState: [CTCallStateDisconnected]
Call ID: [CE5F9337-1990-4254-8797-1CCEA85B061B]
}

CTCall 物件只有两个属性,一是通话状态(来电中、通话中…),二是这则通话的 unique id,除此之外没有其他资讯,你没办法知道这通电话是从哪里打来的,只能知道有电话进来而已,也没办法透过这个 API 打电话出去。

大抵上可以想到的用途,就是当你的程式执行到一半的时候,程式流程被电话打断,这时候就可能要中断原本正在做的事情,在通话结束之后恢复。

最后,CTCallCenter 与 CTTelephonyNetworkInfo,在模拟器上是没有办法用的,呼叫 alloc、init 之后回传的结果只会是 nil。

点击UIStatusBar,UITableView不回到顶部问题解决方法

只有当一个UIViewController控制器有一个scrollview 并把这个属性设置为yes,

其他的scrollview.scrollsToTop = NO 这样才会响应这个事件,原理很简单,如果有3个scrollview,系统根本不知道你需要哪个滚动到最上面。
        比如一个UIViewController中有三个UIView视图,分别为  _pushList,  _photoList,  _starList,且每个视图中都有一个UITableView,设置如下:
 _pushList.table.scrollsToTop = YES;
_photoList.table.scrollsToTop = NO;
_starList.table.scrollsToTop = NO;

Error Domain=NSURLErrorDomain Code=-999 “The operation couldn’t be completed.

– (void)webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error

{

//一个页面没有被完全加载之前收到下一个请求,此时迅速会出现此error,error=-999

//此时可能已经加载完成,则忽略此error,继续进行加载。

//http://stackoverflow.com/questions/1024748/how-do-i-fix-nsurlerrordomain-error-999-in-iphone-3-0-os

if([error code] == NSURLErrorCancelled)

{

return;

}

}

armv6 armv7 armv7s架构的区别

arm结构处理器,几乎所有的手机都基于arm,其在嵌入式系统中应用非常广泛。

ARM 处理器因为低功耗和小尺寸而闻名,它的性能在同等功耗的产品中也很出色。这里我们注意一点,模拟器并不运行arm代码,软件会被编译成x86可以运行的指令。只有在目标设备上,才会执行设备对应的指令集。
ARMv6设备包括
iPhone, iPhone2, iPhone3G以及第一代和第二代iPod Touch
ARMv7设备包括
iPhone3GS, iPhone4
iPad, iPad2, the new ipad
iPod touch 3G, iPod touch 4
ARMv7s设备包括
iPhone5
如果在工程build setting的Architectures中 选“Standard Active Architecture Only”为True则,选择Armv6或v7都只会编译对应指令集的包;若选false,则编译器会整合两个指令集到一起,则包比较大,但是能使用Armv7 的优化,同时能适配到老的机器。一般Debug的时候“Build Active Architecture Only”选择YES,用当前架构看代码逻辑是否有问题,发Release的时候选择NO,因为需要适配其他的机型。
低arm的包可以在高arm的机子上跑,反之则不可以。

Xcode ARC需要什么版本的环境支持

Mac OS X v10.6 和 v10.7 (64位应用) 的Xcode 4.2以上版本支持ARC,iOS 4 和 iOS 5 下ARC都能工作,但Weak不支持Mac OS X v10.6 和 iOS 4,所以要想在iOS 4下运行用ARC的程序,只能用strong。

 

1)支持ARC的开发环境:Mac OS X v10.6 和 v10.7 (64位应用) 的Xcode 4.2以上版本

2)支持ARC的运行环境:

2.1 支持weak:iOS 5 或 Mac OS X v10.7以上

2.2 不支持weak: iOS 4 或 Mac OS X v10.6

 

arc不是一个运行时功能,所以不依赖运行时的环境。
arc可以理解成一种编译时的代码优化。他的工作原理是,在编译过程中,把你的源码自动加上retain release autorelease什么的。
所以,任何时候都可以使用arc