GVKun编程网logo

Objective-C 和 Swift 第三方库使用(swift常用第三方库)

3

在这篇文章中,我们将为您详细介绍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 和 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在一开始就抛出异常

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]));
    }
}

谢谢!

解决方法

检查xib文件.查看所有Referenced Outlets并检查您是否链接到不存在的属性.

您可能还想为项目添加一个Exception(Xcode 4.2):

>打开断点导航器>“”在左下角

objective-c – iPhone SDK Objective C是否支持函数内部的函数?

objective-c – iPhone SDK Objective C是否支持函数内部的函数?

我知道 javascript,例如支持函数内部的函数,如下所示:
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支持嵌套函数作为C的扩展(默认情况下禁用).我认为这个选项不适用于带有gcc的Objective-C(或C),即使它是使用它可能不是一个好主意(可移植性等).

gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html

objective-c – NSTask NSPipe – objective c命令行帮助

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 Bug
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释放内存(内存泄漏)

objective-c – Objective C / iOS:使用ARC释放内存(内存泄漏)

我是iOS / Objective-C的新手,我不理解正确释放内存.
为了测试它,我创建了一个空的启用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释放内存(内存泄漏)等相关知识的信息别忘了在本站进行查找喔。

本文标签: