在这篇文章中,我们将为您详细介绍Objective-C和Swift第三方库使用的内容,并且讨论关于swift常用第三方库的相关问题。此外,我们还会涉及一些关于objective-c–iOS,Objec
在这篇文章中,我们将为您详细介绍Objective-C 和 Swift 第三方库使用的内容,并且讨论关于swift常用第三方库的相关问题。此外,我们还会涉及一些关于objective-c – iOS,Objective c在一开始就抛出异常、objective-c – iPhone SDK Objective C是否支持函数内部的函数?、objective-c – NSTask NSPipe – objective c命令行帮助、objective-c – Objective C / iOS:使用ARC释放内存(内存泄漏)的知识,以帮助您更全面地了解这个主题。
本文目录一览:- Objective-C 和 Swift 第三方库使用(swift常用第三方库)
- objective-c – iOS,Objective c在一开始就抛出异常
- objective-c – iPhone SDK Objective C是否支持函数内部的函数?
- objective-c – NSTask NSPipe – objective c命令行帮助
- objective-c – Objective C / iOS:使用ARC释放内存(内存泄漏)
Objective-C 和 Swift 第三方库使用(swift常用第三方库)
注1:文章写于2016年9月,(swift 3.0、Xcode 8)不同版本可能不同,仅作参考。
注2:个人总结出的最好方式是使用cocoapods,没有用过的请参看之前的文章。
OC 第三方框架以 AFNetworking 3.1.0 为例。
Swift 第三方框架 Alamofire 4.0.0 为例。
一、通过cocopods导入项目:
(1)搜索第三方库
(2)创建Podfile文件
(3)编辑Podfile文件
(4)导入第三方库到工程
1、第三方库是swift库,导入到swift项目。
用到的文件中需要:import Alamofire
2、第三方库是swift库,导入到OC项目。
不考虑
3、第三方库是OC库,导入到swift项目。
用到的文件中需要:import AFNetworking
4、第三方库是OC库,导入到OC项目。
用到的文件中需要:#import "AFNetworking.h"
二、直接将文件粘贴到项目:
测试发现,有些第三方库拖进swift项目目录里直接可以用,比如IQKeyboardManagerSwift等。
如果第三方库是swift,不需要import,直接可用;如果第三方库是OC,在Bridge头文件中添加。
原因分析:https://segmentfault.com/q/10...
1、第三方库是swift库,粘贴到swift项目。
参考下面的A
(1)在项目目录下使用git语句:git submodule add https://github.com/Alamofire/Alamofire.git
或者 去官网上下载下来将整个文件夹放到项目目录下
(2)将下载到本地的文件夹中Alamofire.xcodeproj 文件拖到项目中去
(3)General->Embedded Binaries-> + -> iOS -> Add
在需要用到的swift文件中:import Alamofire
2、第三方库是swift库,粘贴到OC项目。
不考虑
3、第三方库是OC库,粘贴到swift项目。
A. 添加库方法
(1)在项目目录下使用git语句:git submodule add https://github.com/AFNetworking/AFNetworking.git
或者 去官网上下载下来将整个文件夹放到项目目录下
(2)将下载到本地的文件夹中AFNetworking.xcodeproj 文件拖到项目中去
(3)General->Embedded Binaries-> + -> iOS -> Add
在需要用到的swift文件中:import AFNetworking
B. 在A的基础上(或者用cocoapods导入OC框架后),创建Bridge头文件,这样不需要每次写impot就可以整个项目使用。
(1)创建一个普通的头文件,一般命名为项目名-Bridge-Header.h
(2)在头文件里面编写:
#ifndef Swift_test_Bridging_Header_h
#define Swift_test_Bridging_Header_h
#import <AFNetworking/AFNetworking.h>
#endif
(3)添加头文件到Build Settings -> Objective-C Bridging Header
==>快捷方法:
新建一个OC文件,选择自动创建头文件,然后在头文件里面编写 如上内容,删除OC文件。
Build Settings -> Objective-C Bridging Header 会自动添加。
4、第三方库是OC库,粘贴到OC项目。
用到的文件中需要:#import "AFNetworking.h"
三、import时<>括号和""的区别
(1)在项目中导入库或者类的时候经常看到" #import <库名>" 或者 “#import ''类名.h''" .
(2)""表示从当前项目路径开始寻找文件,如果找不到,则到系统(项目)中配置的头文件路径去找;
(3)<>表示直接到系统(项目)中配置的头文件路径去找。
objective-c – iOS,Objective c在一开始就抛出异常
这是代码:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { self.window = [[[UIWindow alloc] initWithFrame:[[UIScreen mainScreen] bounds]] autorelease]; // Override point for customization after application launch. self.viewController = [[[ViewController alloc] initWithNibName:@"ViewController" bundle:nil] autorelease]; self.window.rootViewController = self.viewController; [self.window makeKeyAndVisible]; \\ throw exception on this line return YES; }
例外情况如下:
Thread 1: Program received signal: "SIGABRT"
当main.m上显示实际异常时(我没有创建它也看不到它):
int main(int argc,char *argv[]) { @autoreleasepool { return UIApplicationMain(argc,argv,nil,NsstringFromClass([AppDelegate class])); } }
谢谢!
解决方法
您可能还想为项目添加一个Exception(Xcode 4.2):
>打开断点导航器>“”在左下角
objective-c – iPhone SDK Objective C是否支持函数内部的函数?
function doSomething(){ function doAnothingThing(){ //this function is redefined every time doSomething() is called and only exists inside doSomething() } //you can also stick it inside of conditions if(yes){ function doSomethingElse(){ //this function only exists if yes is true } } }
Objective-c是否支持此功能?理论范例:
-(void) doSomething:(id) sender{ -(void) respondToEvent: (id) sender{ //theoretically? ... please? } }
奖励:“本地”功能的正确用语是什么?
解决方法
gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
objective-c – NSTask NSPipe – objective c命令行帮助
task = [[NSTask alloc] init]; [task setCurrentDirectoryPath:@"/applications/jarvis/brain/"]; [task setLaunchPath:@"/applications/jarvis/brain/server.sh"]; NSPipe * out = [NSPipe pipe]; [task setStandardOutput:out]; [task launch]; [task waitUntilExit]; [task release]; NSFileHandle * read = [out fileHandleForReading]; NSData * dataRead = [read readDataToEndOfFile]; Nsstring * stringRead = [[[Nsstring alloc] initWithData:dataRead encoding:NSUTF8StringEncoding] autorelease];
所以我试图复制这个:
cd /applications/jarvis/brain/ ./server.sh
但是在目标c中使用NSTask.
由于某些原因,当我运行这个代码,stringRead,什么都不返回.当我启动.sh文件时,应该返回什么终端返回.正确?
有任何想法吗?
以利亚
解决方法
Xcode中存在一个错误,它会在启动了标准输出的新任务之后停止打印任何输出(它收集所有输出,但不再打印任何内容).您将要调用[task setStandardInput:[NSPipe pipe]]来使其再次显示输出(或者,将任务打印到stderr而不是stdout).
最终代码建议:
NSTask *server = [NSTask new]; [server setLaunchPath:@"/bin/sh"]; [server setArguments:[NSArray arrayWithObject:@"/path/to/server.sh"]]; [server setCurrentDirectoryPath:@"/path/to/current/directory/"]; NSPipe *outputPipe = [NSPipe pipe]; [server setStandardInput:[NSPipe pipe]]; [server setStandardOutput:outputPipe]; [server launch]; [server waitUntilExit]; // Alternatively,make it asynchronous. [server release]; NSData *outputData = [[outputPipe fileHandleForReading] readDataToEndOfFile]; Nsstring *outputString = [[[Nsstring alloc] initWithData:outputData encoding:NSUTF8StringEncoding] autorelease]; // Autorelease optional,depending on usage.
objective-c – Objective C / iOS:使用ARC释放内存(内存泄漏)
为了测试它,我创建了一个空的启用ARC的iPhone-Project并创建了一个非常简单的测试类:
#import "MemTest.h" @implementation MemTest { } -(void) start { for (int i = 0; i < 1500000; i++) { NSMutableString *myString = [NSMutableString string]; // The appended string is 2000 characters long in the real test class. [myString appendString:@"12345678901234567890123456 <very long>"]; if (i % 1000 == 0) { NSLog(@"i = %d",i); } myString = nil; } } @end
我只是在AppDelegate中开始测试:
- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions { MemTest *test = [[MemTest alloc] init]; [test start]; .... }
应用程序(正如预期的那样)打印许多不错的数字“i = xy”,但内存使用量随着每次迭代而增加,最后应用程序崩溃:
.... 2012-12-06 20:17:40.193 MemTestApp[19250:11303] i = 930000 2012-12-06 20:17:40.208 MemTestApp[19250:11303] i = 931000 MemTestApp(19250,0xac63f2c0) malloc: *** mmap(size=16777216) Failed (error code=12) *** error: can't allocate region *** set a breakpoint in malloc_error_break to debug
所以我的问题是:为什么内存使用量会增长?
我认为通过分配nil,应该在使用ARC时释放内存.我在这里想念的是什么?
解决方法
>您可能实际上没有启用ARC.你应该仔细检查一下.最简单的方法是在代码中引入-retain并确保抛出编译器错误.
> ARC不一定会阻止对象进入自动释放池.它试图抓住它,如果它可以,但它不能保证.值得注意的是,在-O0(无优化)时,它经常不会阻止对象进入自动释放池.这很可能是你发生的事情.
>即使在更高的优化级别,仍然不能保证启用ARC的代码能够捕获自动释放.
如果你在for循环中粘贴@autoreleasepool {},你会发现内存使用量应该消失.或者,不是使用[NSMutableString string],而是可以尝试[NSMutableString new],它根本不使用自动释放池*,但在ARC代码中应该具有相同的行为.
*嗯,如果需要,NSMutableString可以在内部自由使用自动释放池
关于Objective-C 和 Swift 第三方库使用和swift常用第三方库的问题就给大家分享到这里,感谢你花时间阅读本站内容,更多关于objective-c – iOS,Objective c在一开始就抛出异常、objective-c – iPhone SDK Objective C是否支持函数内部的函数?、objective-c – NSTask NSPipe – objective c命令行帮助、objective-c – Objective C / iOS:使用ARC释放内存(内存泄漏)等相关知识的信息别忘了在本站进行查找喔。
本文标签: