作者:Love@YR
链接:http://blog.csdn.net/jingqiu880905/article/details/51690345
请尊重原创,谢谢!
如何快速区别一个工程是其他工程的子工程还是单独可以运行的项目?
查看这个工程里有没有main.m,有的话即是单独可以运行的项目。否则可能就是其他工程的依赖子工程,一般是会以静态库作为最终的表现形式。如何避免block的循环引用
//创建一个NSInvocationOperation
NSInvocationOperation *invoOp6 = [[NSInvocationOperation alloc] initWithTarget:(id)self selector:@selector(handleInvoOp) object:nil];
__weak typeof (NSInvocationOperation *)weak_invoOp6 = invoOp6;
[invoOp6 setCompletionBlock:^{
NSLog(@"invoOp6........OK !!");
id result = [weak_invoOp6 result];
NSLog(@"result is %@",result);
}];
-(NSString *)handleInvoOp
{
NSLog(@"InvoOp.....handle.....on thread num%@",[NSThread currentThread]);
sleep(8);
return @"第6个operation返回啦";
}
block里面如果还用invoOp6就会报强引用invoOp6可能会引起循环引用的警告,而如果直接把invoOp6前面加上__weak关键字则会在还未等到回调就释放了invoOp6。所以最终的解决方法如上。
其他更多关于block可参考:
http://blog.csdn.net/fengsh998/article/details/38090205
3. 如果没有重写NSOperation对象的start方法而直接start一个operation是会阻塞主线程的,如果是个耗时操作会明显看到UI无响应。这期间对UI的动作例如button的click事件会被添加到此操作之后同步执行。
如何利用AFNetWorking创建一个同步的请求?
AFHTTPRequestOperation *opt = [self.inner_httpRequestManager HTTPRequestOperationWithRequest:request success:nil failure:nil];
[opt start];
[opt waitUntilFinished];
异步的话就:
[self.inner_httpRequestManager.operationQueue addOperation:opt];
此处的inner_httpRequestManager 是AFHTTPRequestOperationManager单例
waitUntilFinished的作用是阻塞当前运行的线程(必然不能是此operation运行的线程),直到此operation结束。
看AFNetworking2.x的源码知道AFHTTPRequestOperation继承自AFURLConnectionOperation,AFURLConnectionOperation的start方法里说了
[self performSelector:@selector(operationDidStart) onThread:[[self class] networkRequestThread] withObject:nil waitUntilDone:NO modes:[self.runLoopModes allObjects]];
走到后面发现
//创建了一个新的子线程
dispatch_once(&oncePredicate, ^{
_networkRequestThread = [[NSThread alloc] initWithTarget:self selector:@selector(networkRequestThreadEntryPoint:) object:nil];
[_networkRequestThread start];
});
//给这个线程取名为AFNetworking
[[NSThread currentThread] setName:@"AFNetworking"];
NSRunLoop *runLoop = [NSRunLoop currentRunLoop];
[runLoop addPort:[NSMachPort port] forMode:NSDefaultRunLoopMode];
[runLoop run];
说明此opt不是在主线程的,所以不用担心在didFinishLaunchingWithOptions里测试时因为创建operation时调了[opt waitUntilFinished]而阻塞主线程。
4. auto-layout约束里的ratio:指宽高比
5. 通常在xcode里加入一个文件夹,直接将此文件夹拖入工程里,选择了copy items if need和create groups后,文件旁边出现了?的标注,代表并未识别文件的修改状态。此时点击source control-add selected files,这样文件就由?变成了A
6. 在Xcode中创建code snippet: 首先把格式代码写入文档中,然后选中代码拉入右方的code snippet 库,编辑即可。
7. 到底Cocoa Touch是啥?
看维基百科:https://en.wikipedia.org/wiki/Cocoa_Touch
iOS, watchOS, and tvOS technologies can be seen as a set of layers, with Cocoa Touch at the highest level and the Core OS/kernel at the bottom.
A hierarchical view of the iOS, watchOS, and tvOS technologies can be shown as follows:
Cocoa Touch
Media / Application Services
Core Services
Core OS / iOS kernel
Main frameworks
Cocoa Touch provides the key frameworks for developing applications on devices running iOS. Some of these key frameworks are:
Foundation Kit Framework
UIKit Framework (based on Application Kit)
GameKit Framework
iAd Framework
MapKit Framework
Address Book UI Framework
EventKit UI Framework
Message UI Framework
Notification Center Framework
PushKit Framework
Twitter Framework
其他几个层分别有什么:
直观图:http://blog.csdn.net/GooHong/article/details/28911301
媒体层:http://blog.csdn.net/iukey/article/details/7666442
Core Services 层:http://blog.csdn.net/iukey/article/details/7666460
Core OS层:http://blog.csdn.net/iukey/article/details/7666469
Cocoa Touch 包含的框架都干嘛的:http://blog.csdn.net/iukey/article/details/7666430
8. “?:”干嘛的
-(void)test{
NSString * m=nil;
[self logStr:m?:@"jeanhaha"];
// m?:NSLog(@"m is %@",m);
int i=10;
i==11?:NSLog(@"i !=非10的值");
}
-(void)logStr:(NSString *)str
{
NSLog(@"str is %@",str);
}
一般我们看到的都是(表达式)?操作1:操作2 那直接?:干嘛的呢
其实就是把操作1省了, 即前面表达式如果为NO则执行:后面的
上面那个 [self logStr:m?:@”jeanhaha”];代表的意思就是如果m为空,把:后面的传过去,否则把m当参数传过去
9. id 和 instancetype什么区别?
id不能指定类型而instancetype可以。
那么以前的方法[[ClassName alloc]init]之后为什么就知道了类型呢?因为编译器对特定的几种方法做了关联类型返回,如alloc,init。但是像NSArray的array方法就没有做关联类型返回。当然现在Foudation里绝大部分的id都已经换成了instancetype就不再存在这种问题。用了instancetype后返回的对象类型即为调用的类的类型。
10. 有时会出现xcodeproj cannot be opened because the project file cannot be parsed的错误
是因为proj文件有冲突。选中.xcodeproj,右键,show package contents。打开project.pbxproj,解决冲突,保存,即可。
11. OC语法糖:http://blog.csdn.net/u014165686/article/details/38545543