第一个OC程序

本文介绍Objective-C中头文件的使用方法,包括#import与#include的区别,如何使用主头文件来简化工具箱中各工具的调用过程,并展示了如何在Objective-C中混用C语言代码。
#include <stdio.h>

// Foundation.h我们称之为主头文件, 主头文件中又拷贝了该工具箱中所有工具的头文件, 我们只需要导入主头文件就可以使用该工具箱中所有的工具, 避免了每次使用都要导入一个对应的头文件
// 工具箱的地址: /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS.sdk/System/Library/Frameworks
// 规律: 所有的主头文件的名称都和工具箱的名称一致
//      所有的主头文件都是导入了该工具箱中所有工具的头文件

#import <Foundation/Foundation.h>
#import <Foundation/Foundation.h>
#import <Foundation/Foundation.h>
#import <Foundation/Foundation.h>


/*
 import 的功能和 include一样, 是将右边的文件拷贝到当前import的位置
 为了降低程序员的负担, 防止重复导入, 避免程序员去书写 头文件卫士, 那么OC给出来一个新的预处理指令import
 import优点: 会自动防止重复拷贝
 */

/*
 因为OC完全兼容C, 所以可以在OC程序中编写C语言代码
 并且可以将C语言的源文件和OC的源文件组合在一起生成可执行文件
 */
#import "zs.h"

int main(int argc, const char * argv[]) {
    // 1.OC是兼容C的
    printf("c hello world\n");
    printf("c hello world\n");
    /*
     printf和NSLog的区别:
     NSLog会自动换行
     NSLog在输出内容时会附加一些系统信息
     NSLog和printf接收的参数不一样
     */
    NSLog(@"OC hello World");
    NSLog(@"OC hello World");
    
    NSLog(@"sum = %i", sum(20, 10));
    return 0;
}

 以上main.m

 

zs.h

#include <stdio.h>
int sum(int v1, int v2);

#endif

zs.c

#include "zs.h"

int sum(int v1, int v2)
{
    return v1 + v2;
}

 

转载于:https://www.cnblogs.com/xufengyuan/p/6476901.html

### 使用Objective-C实现USB传输编程 对于USB传输编程,在Objective-C环境中通常依赖于苹果提供的IOKit框架来访问底层硬件资源。此框架允许开发者创建驱动程序管理连接至系统的各种设备,包括USB设备。 为了初始化与特定USB设备之间的通信,需先获取该设备的信息,建立相应的连接对象。下面是一个简单的例子展示如何枚举已连接的USB设备: ```objective-c #import <Foundation/Foundation.h> #import <IOKit/usb/IOUSBLib.h> // 定义回调函数以处理找到的匹配项 static void deviceMatchingCallback(void *refCon, io_iterator_t iterator) { io_service_t service; while ((service = IOIteratorNext(iterator))) { CFMutableDictionaryRef propertyMatch; // 获取属性字典 if (KERN_SUCCESS != IORegistryEntryCreateCFProperties(service, &propertyMatch, kCFAllocatorDefault, 0)) { continue; // 如果无法读取则跳过当前服务 } NSLog(@"Found a matching USB Device"); // 打印一些基本信息作为示范 const char* productName = NULL; if (propertyMatch && CFGetTypeID(propertyMatch) == CFDictionaryGetTypeID()) { CFStringRef nameStr = (CFStringRef)CFDictionaryGetValue( propertyMatch, CFSTR(kUSBProductString)); if(nameStr){ ProductName = CFStringGetCStringPtr(nameStr, kCFStringEncodingUTF8); NSLog(@"Device Name:%s",productName); } } // 清理工作... if (propertyMatch) { CFRelease(propertyMatch); } IOObjectRelease(service); } } int main(int argc, const char * argv[]) { @autoreleasepool { NSBundle *mainBundle = [NSBundle mainBundle]; NSString *pathToInfoPlist = [mainBundle pathForResource:@"Info" ofType:@"plist"]; NSDictionary *infoDict = [[NSDictionary alloc] initWithContentsOfFile:pathToInfoPlist]; // 创建一个迭代器用来遍历所有符合条件的服务实例 mach_port_t masterPort; kern_return_t kr = IOMasterPort(MACH_PORT_NULL, &masterPort); io_iterator_t iter; CFMutableDictionaryRef classesToMatch = IOServiceMatching("IOUSBHostInterface"); kr = IOServiceGetMatchingServices(masterPort, classesToMatch, &iter); if (kr == KERN_SUCCESS) { deviceMatchingCallback(NULL, iter); IOObjectRelease(iter); } else { NSLog(@"Failed to get services."); } } return 0; } ``` 上述代码展示了怎样利用`IOKit`库去发现系统中存在的USB主机接口,打印出它们的产品名称[^1]。 一旦找到了目标设备之后,则可以进一步尝试打开它与之交换数据包。这涉及到更复杂的操作比如设置配置描述符、声明端点等细节问题。由于这些过程较为繁琐且容易出错,建议参考官方文档或第三方开源项目中的具体实现方式获得指导。 #### 注意事项 - 上述代码片段仅适用于macOS环境下的开发。 - 实际应用时可能还需要考虑权限管理错误恢复机制等问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值