- 浏览: 328141 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
arlenliugj:
才发现这贴子好早
如何在Ubuntu下安装windows7 -
arlenliugj:
请问一下,这样安装上windows会不会把已经装好的linux ...
如何在Ubuntu下安装windows7 -
zhaomengbin:
写的很不错,可以写个文件给合并的方法么?,将分割后的几份文件还 ...
文件分割程序 -
junhe0723:
3Q,刚出现这个问题解决了。
jvm terminated exit code 1 -
Anddy:
shell 双击选中太不智能了。
XSHELL快捷键设置
CFNetwork封装了具体的网路实现,可以通过CFxxx等api来简单的实现操作
CFNetwork也是基于core foundation的两个API,CFSocket和CFStream
CFSocket是基于BSD socket的抽象,使用CFSocketCreate、CFSocketCreateWithNative
CFSocketCreateRunLoopSource、CFRunLoopAddSource方法创建CFSocket
CFStream提供两种抽象的Stream类型,一种是CFReadStream,一种是CFWriteStream.
使用CFStream读写流数据跟读取UNIX文件类似,首先指定stream的类型(内存、文件、socket等)
然后打开流,进行读写操作。避免主线程阻塞,使用异步方法来读取流。
CFStream支持SSL加密,通过设置kCFStreamPropertySSLSettings属性来设置。
CFNetwork有几种API组成,每种指定着一种网络协议。每种协议的API定义都是类似的
CFFTP API:
1:从ftp服务器中下载文件
2:上传文件到ftp服务器
3:在ftp服务器上创建文件
4:Download a directory listing from an FTP server
CFHTTP API:
CFHTTPAuthentication API支持四种认证方案:
Basic
Digest
NT LAN Manager (NTLM)
Simple and Protected GSS-API Negotiation Mechanism (SPNEGO)
CFHost API处理步骤:
1:创建一个CFHost对象
2:解析CFHost对象
3:获取地址、host名称等信息
4:销毁CFHost对象
CFNetServices API(使用Bonjour服务需要CFNetServices API)
CFNetDiagnostics API(当网络有问题的时候,可以通过这个API来快速定位问题)
//流的读操作
//流的写操作
在数据转化的时候,如果是同步的,那么就有可能会阻塞主线程,有两种方式可以避免:
1:使用run loop(查看Threading Programming Guide):注册run loop的通知方法,然后在对应的事件上发起通知。
2:使用Polling(轮训)
//一般情况下,不建议使用轮训来处理读写流的操作
http请求
http相应
Authenticating HTTP Servers
如果一个http服务器返回401或者407,那么表示服务端需要认证,请求中需要带上证书,在API中,证书放在CFHTTPAuthentication对象中。
把证书放在内存中
持久化证书存储
FTP Servers
创建一个远程目录
下载目录清单
使用网络诊断
CFNetwork也是基于core foundation的两个API,CFSocket和CFStream

CFSocket是基于BSD socket的抽象,使用CFSocketCreate、CFSocketCreateWithNative
CFSocketCreateRunLoopSource、CFRunLoopAddSource方法创建CFSocket
CFStream提供两种抽象的Stream类型,一种是CFReadStream,一种是CFWriteStream.
使用CFStream读写流数据跟读取UNIX文件类似,首先指定stream的类型(内存、文件、socket等)
然后打开流,进行读写操作。避免主线程阻塞,使用异步方法来读取流。
CFStream支持SSL加密,通过设置kCFStreamPropertySSLSettings属性来设置。

CFNetwork有几种API组成,每种指定着一种网络协议。每种协议的API定义都是类似的
CFFTP API:
1:从ftp服务器中下载文件
2:上传文件到ftp服务器
3:在ftp服务器上创建文件
4:Download a directory listing from an FTP server
CFHTTP API:
CFHTTPAuthentication API支持四种认证方案:
Basic
Digest
NT LAN Manager (NTLM)
Simple and Protected GSS-API Negotiation Mechanism (SPNEGO)
CFHost API处理步骤:
1:创建一个CFHost对象
2:解析CFHost对象
3:获取地址、host名称等信息
4:销毁CFHost对象
CFNetServices API(使用Bonjour服务需要CFNetServices API)
CFNetDiagnostics API(当网络有问题的时候,可以通过这个API来快速定位问题)
//流的读操作
//创建一个读的流: CFReadStreamRef myReadStream = CFReadStreamCreateWithFile(kCFAllocatorDefault, fileURL); //打开一个读的流 if (!CFReadStreamOpen(myReadStream)) { CFStreamError myErr = CFReadStreamGetError(myReadStream); // An error has occurred. if (myErr.domain == kCFStreamErrorDomainPOSIX) { // Interpret myErr.error as a UNIX errno. } else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) { // Interpret myErr.error as a MacOS error code. OSStatus macError = (OSStatus)myErr.error; // Check other error domains. } } //从流中读取数据 CFIndex numBytesRead; do { UInt8 buf[myReadBufferSize]; // define myReadBufferSize as desired numBytesRead = CFReadStreamRead(myReadStream, buf, sizeof(buf)); if( numBytesRead > 0 ) { handleBytes(buf, numBytesRead); } else if( numBytesRead < 0 ) { CFStreamError error = CFReadStreamGetError(myReadStream); reportError(error); } } while( numBytesRead > 0 ); //关闭流 CFReadStreamClose(myReadStream); CFRelease(myReadStream); myReadStream = NULL;
//流的写操作
CFWriteStreamRef myWriteStream = CFWriteStreamCreateWithFile(kCFAllocatorDefault, fileURL); if (!CFWriteStreamOpen(myWriteStream)) { CFStreamError myErr = CFWriteStreamGetError(myWriteStream); // An error has occurred. if (myErr.domain == kCFStreamErrorDomainPOSIX) { // Interpret myErr.error as a UNIX errno. } else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) { // Interpret myErr.error as a MacOS error code. OSStatus macError = (OSStatus)myErr.error; // Check other error domains. } } UInt8 buf[] = "Hello, world"; CFIndex bufLen = (CFIndex)strlen(buf); while (!done) { CFIndex bytesWritten = CFWriteStreamWrite(myWriteStream, buf, (CFIndex)bufLen); if (bytesWritten < 0) { CFStreamError error = CFWriteStreamGetError(myWriteStream); reportError(error); } else if (bytesWritten == 0) { if (CFWriteStreamGetStatus(myWriteStream) == kCFStreamStatusAtEnd) { done = TRUE; } } else if (bytesWritten != bufLen) { // Determine how much has been written and adjust the buffer bufLen = bufLen - bytesWritten; memmove(buf, buf + bytesWritten, bufLen); // Figure out what went wrong with the write stream CFStreamError error = CFWriteStreamGetError(myWriteStream); reportError(error); } } CFWriteStreamClose(myWriteStream); CFRelease(myWriteStream); myWriteStream = NULL;
在数据转化的时候,如果是同步的,那么就有可能会阻塞主线程,有两种方式可以避免:
1:使用run loop(查看Threading Programming Guide):注册run loop的通知方法,然后在对应的事件上发起通知。
2:使用Polling(轮训)
//创建一个socket,读流 CFStreamCreatePairWithSocketToCFHost(kCFAllocatorDefault, host, port, &myReadStream, NULL); //创建一个容器,主要为了回调方法用 CFStreamClientContext myContext = {0, myPtr, myRetain, myRelease, myCopyDesc}; //创建run loop CFOptionFlags registeredEvents = kCFStreamEventHasBytesAvailable | kCFStreamEventErrorOccurred | kCFStreamEventEndEncountered; if (CFReadStreamSetClient(myReadStream, registeredEvents, myCallBack, &myContext)) { CFReadStreamScheduleWithRunLoop(myReadStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); } //创建一个非阻塞的读流 if (!CFReadStreamOpen(myReadStream)) { CFStreamError myErr = CFReadStreamGetError(myReadStream); if (myErr.error != 0) { // An error has occurred. if (myErr.domain == kCFStreamErrorDomainPOSIX) { // Interpret myErr.error as a UNIX errno. strerror(myErr.error); } else if (myErr.domain == kCFStreamErrorDomainMacOSStatus) { OSStatus macError = (OSStatus)myErr.error; } // Check other domains. } else // start the run loop CFRunLoopRun(); } //网络请求回调方法 void myCallBack (CFReadStreamRef stream, CFStreamEventType event, void *myPtr) { switch(event) { case kCFStreamEventHasBytesAvailable: // It is safe to call CFReadStreamRead; it won’t block because bytes // are available. UInt8 buf[BUFSIZE]; CFIndex bytesRead = CFReadStreamRead(stream, buf, BUFSIZE); if (bytesRead > 0) { handleBytes(buf, bytesRead); } // It is safe to ignore a value of bytesRead that is less than or // equal to zero because these cases will generate other events. break; case kCFStreamEventErrorOccurred: CFStreamError error = CFReadStreamGetError(stream); reportError(error); CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); CFReadStreamClose(stream); CFRelease(stream); break; case kCFStreamEventEndEncountered: reportCompletion(); CFReadStreamUnscheduleFromRunLoop(stream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes); CFReadStreamClose(stream); CFRelease(stream); break; } }
//一般情况下,不建议使用轮训来处理读写流的操作
//轮训一个读流 while (!done) { if (CFReadStreamHasBytesAvailable(myReadStream)) { UInt8 buf[BUFSIZE]; CFIndex bytesRead = CFReadStreamRead(myReadStream, buf, BUFSIZE); if (bytesRead < 0) { CFStreamError error = CFReadStreamGetError(myReadStream); reportError(error); } else if (bytesRead == 0) { if (CFReadStreamGetStatus(myReadStream) == kCFStreamStatusAtEnd) { done = TRUE; } } else { handleBytes(buf, bytesRead); } } else { // ...do something else while you wait... } } //轮训一个写的流 UInt8 buf[] = "Hello, world"; UInt32 bufLen = strlen(buf); while (!done) { if (CFWriteStreamCanAcceptBytes(myWriteStream)) { int bytesWritten = CFWriteStreamWrite(myWriteStream, buf, strlen(buf)); if (bytesWritten < 0) { CFStreamError error = CFWriteStreamGetError(myWriteStream); reportError(error); } else if (bytesWritten == 0) { if (CFWriteStreamGetStatus(myWriteStream) == kCFStreamStatusAtEnd) { done = TRUE; } } else if (bytesWritten != strlen(buf)) { // Determine how much has been written and adjust the buffer bufLen = bufLen - bytesWritten; memmove(buf, buf + bytesWritten, bufLen); // Figure out what went wrong with the write stream CFStreamError error = CFWriteStreamGetError(myWriteStream); reportError(error); } } else { // ...do something else while you wait... } }
http请求
//创建一个http request请求 CFStringRef bodyString = CFSTR(""); // Usually used for POST data CFDataRef bodyData = CFStringCreateExternalRepresentation(kCFAllocatorDefault, bodyString, kCFStringEncodingUTF8, 0); CFStringRef headerFieldName = CFSTR("X-My-Favorite-Field"); CFStringRef headerFieldValue = CFSTR("Dreams"); CFStringRef url = CFSTR("http://www.apple.com"); CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL); CFStringRef requestMethod = CFSTR("GET"); CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myURL,CFDataRef bodyDataExt = CFStringCreateExternalRepresentation(kCFAllocatorDefault, bodyData, kCFStringEncodingUTF8, 0); CFHTTPMessageSetBody(myRequest, bodyDataExt); CFHTTPMessageSetHeaderFieldValue(myRequest, headerFieldName, headerFieldValue); CFDataRef mySerializedRequest = CFHTTPMessageCopySerializedMessage(myRequest); //release请求 CFRelease(myRequest); CFRelease(myURL); CFRelease(url); CFRelease(mySerializedRequest); myRequest = NULL; mySerializedRequest = NULL; Communicating with HTTP Servers Creating a CFHTTP Request 2012-
http相应
//反序列化信息 CFHTTPMessageRef myMessage = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, TRUE); if (!CFHTTPMessageAppendBytes(myMessage, &data, numBytes)) { //Handle parsing error } //反序列化成功 if (CFHTTPMessageIsHeaderComplete(myMessage)) { // Perform processing. } //反序列化之后可以调用CFHTTPMessageCopyBody等方法获取对应的数据
//通过读的流,序列化一个http请求 CFStringRef url = CFSTR("http://www.apple.com"); CFURLRef myURL = CFURLCreateWithString(kCFAllocatorDefault, url, NULL); CFStringRef requestMethod = CFSTR("GET"); CFHTTPMessageRef myRequest = CFHTTPMessageCreateRequest(kCFAllocatorDefault, requestMethod, myUrl, kCFHTTPVersion1_1); CFHTTPMessageSetBody(myRequest, bodyData); CFHTTPMessageSetHeaderFieldValue(myRequest, headerField, value); CFReadStreamRef myReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest); CFReadStreamOpen(myReadStream); //通过CFReadStreamCopyProperty,监听响应 CFHTTPMessageRef myResponse = (CFHTTPMessageRef)CFReadStreamCopyProperty(myReadStream, kCFStreamPropertyHTTPResponseHeader); //返回响应code UInt32 myErrCode = CFHTTPMessageGetResponseStatusCode(myResponse); //重定向流 CFReadStreamClose(myReadStream); CFReadStreamRef myReadStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, myRequest); if (CFReadStreamSetProperty(myReadStream, kCFStreamPropertyHTTPShouldAutoredirect, kCFBooleanTrue) == false) { // something went wrong, exit } CFReadStreamOpen(myReadStream); //关闭流就相当于关闭了这个请求
Authenticating HTTP Servers
如果一个http服务器返回401或者407,那么表示服务端需要认证,请求中需要带上证书,在API中,证书放在CFHTTPAuthentication对象中。


//创建一个authentication对象 if (!authentication) { CFHTTPMessageRef responseHeader = (CFHTTPMessageRef) CFReadStreamCopyProperty( readStream, kCFStreamPropertyHTTPResponseHeader ); // Get the authentication information from the response. authentication = CFHTTPAuthenticationCreateFromResponse(NULL, responseHeader); CFRelease(responseHeader); } //判断这个authentication是否验证 CFStreamError err; if (!authentication) { // the newly created authentication object is bad, must return return; } else if (!CFHTTPAuthenticationIsValid(authentication, &err)) {// destroy authentication and credentials if (credentials) { CFRelease(credentials); credentials = NULL; } CFRelease(authentication); authentication = NULL; // check for bad credentials (to be treated separately) if (err.domain == kCFStreamErrorDomainHTTP && (err.error == kCFStreamErrorHTTPAuthenticationBadUserName || err.error == kCFStreamErrorHTTPAuthenticationBadPassword)) { retryAuthorizationFailure(&authentication); return; } else { errorOccurredLoadingImage(err); } } //如果找到证书,那么使用它 else { cancelLoad(); if (credentials) { resumeWithCredentials(); } // are a user name & password needed? else if (CFHTTPAuthenticationRequiresUserNameAndPassword(authentication)) { CFStringRef realm = NULL; CFURLRef url = CFHTTPMessageCopyRequestURL(request); // check if you need an account domain so you can display it if necessary if (!CFHTTPAuthenticationRequiresAccountDomain(authentication)) { realm = CFHTTPAuthenticationCopyRealm(authentication); } // ...prompt user for user name (user), password (pass) // and if necessary domain (domain) to give to the server... // Guarantee values if (!user) user = CFSTR(""); if (!pass) pass = CFSTR(""); CFDictionarySetValue(credentials, kCFHTTPAuthenticationUsername, user); CFDictionarySetValue(credentials, kCFHTTPAuthenticationPassword, pass); // Is an account domain needed? (used currently for NTLM only) if (CFHTTPAuthenticationRequiresAccountDomain(authentication)) { if (!domain) domain = CFSTR(""); CFDictionarySetValue(credentials,kCFHTTPAuthenticationAccountDomain, domain); } if (realm) CFRelease(realm); CFRelease(url); } else { resumeWithCredentials(); } } //发起拥有证书的请求 void resumeWithCredentials() { // Apply whatever credentials we've built up to the old request if (!CFHTTPMessageApplyCredentialDictionary(request, authentication, credentials, NULL)) { errorOccurredLoadingImage(); } else { // Now that we've updated our request, retry the load loadRequest(); } }
把证书放在内存中
//创建一个array来放不同的证书 CFMutableArrayRef authArray; //创建一个证书的映射 CFMutableDictionaryRef credentialsDict; //修改映射 CFDictionaryRemoveValue(credentialsDict, authentication); //寻找一个合适的证书 CFHTTPAuthenticationRef findAuthenticationForRequest { int i, c = CFArrayGetCount(authArray); for (i = 0; i < c; i ++) { CFHTTPAuthenticationRef auth = (CFHTTPAuthenticationRef) CFArrayGetValueAtIndex(authArray, i); if (CFHTTPAuthenticationAppliesToRequest(auth, request)) { return auth; } } return NULL; } //获取证书 credentials = CFDictionaryGetValue(credentialsDict, authentication);
持久化证书存储
CFMutableDictionaryRef findCredentialsForAuthentication( CFHTTPAuthenticationRef auth); void saveCredentialsForRequest(void); //如果证书不在缓存中,那么从钥匙串中寻找 didFind = SecKeychainFindInternetPassword(NULL, strlen(host), host, realm ? strlen(realm) : 0, realm, 0, NULL, path ? strlen(path) : 0, path, port, protocolType, authenticationType, 0, NULL, &itemRef); //从钥匙串中加载服务器证书 if (didFind == noErr) { SecKeychainAttribute attr; SecKeychainAttributeList attrList; UInt32 length; void *outData; // To set the account name attribute attr.tag = kSecAccountItemAttr; attr.length = 0; attr.data = NULL; attrList.count = 1; attrList.attr = &attr; if (SecKeychainItemCopyContent(itemRef, NULL, &attrList, &length, &outData) == noErr) { // attr.data is the account (username) and outdata is the password CFStringRef username = CFStringCreateWithBytes(kCFAllocatorDefault, attr.data, attr.length, kCFStringEncodingUTF8, false); CFStringRef password = CFStringCreateWithBytes(kCFAllocatorDefault, outData, length, kCFStringEncodingUTF8, false); SecKeychainItemFreeContent(&attrList, outData); // create credentials dictionary and fill it with the user name & password credentials = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks); CFDictionarySetValue(credentials, kCFHTTPAuthenticationUsername, username); CFDictionarySetValue(credentials, kCFHTTPAuthenticationPassword, password); CFRelease(username); CFRelease(password); } CFRelease(itemRef); } //修改钥匙串的实体 // Set the attribute to the account name attr.tag = kSecAccountItemAttr; attr.length = strlen(username); attr.data = (void*)username; // Modify the keychain entry SecKeychainItemModifyContent(itemRef, &attrList, strlen(password), (void *)password); //保存钥匙串实体 SecKeychainAddInternetPassword(NULL,strlen(host), host, realm ? strlen(realm) : 0, realm, strlen(username), username, path ? strlen(path) : 0, path, port, protocolType, authenticationType, strlen(password), password, &itemRef);
FTP Servers
//流的结构 typedef struct MyStreamInfo { CFWriteStreamRef writeStream; CFReadStreamRef readStream; CFDictionaryRef proxyDict; SInt64 fileSize; UInt32 totalBytesWritten; UInt32 leftOverByteCount; UInt8 buffer[kMyBufferSize]; } MyStreamInfo; //从读流中写数据 bytesRead = CFReadStreamRead(info->readStream, info->buffer, kMyBufferSize); //...make sure bytesRead > 0 ... bytesWritten = 0; while (bytesWritten < bytesRead) { CFIndex result; result = CFWriteStreamWrite(info->writeStream, info->buffer + bytesWritten, bytesRead - bytesWritten); if (result <= 0) { fprintf(stderr, "CFWriteStreamWrite returned %ld\n", result); goto exit; } bytesWritten += result; } info->totalBytesWritten += bytesWritten; //上传文件 do { // Check for leftover data if (info->leftOverByteCount > 0) { bytesRead = info->leftOverByteCount; } else { // Make sure there is no error reading from the file bytesRead = CFReadStreamRead(info->readStream, info->buffer, kMyBufferSize); if (bytesRead < 0) { fprintf(stderr, "CFReadStreamRead returned %ld\n", bytesRead); goto exit; } totalBytesRead += bytesRead; } // Write the data to the write stream bytesWritten = CFWriteStreamWrite(info->writeStream, info->buffer, bytesRead); if (bytesWritten > 0) { info->totalBytesWritten += bytesWritten; // Store leftover data until kCFStreamEventCanAcceptBytes event occurs again if (bytesWritten < bytesRead) { info->leftOverByteCount = bytesRead - bytesWritten; memmove(info->buffer, info->buffer + bytesWritten, info->leftOverByteCount); } else { info->leftOverByteCount = 0; } } else { if (bytesWritten < 0) fprintf(stderr, "CFWriteStreamWrite returned %ld\n", bytesWritten); break; } } while (CFWriteStreamCanAcceptBytes(info->writeStream));
创建一个远程目录
下载目录清单
//从目录清单下载数据 // If previous call had unloaded data int offset = info->leftOverByteCount; // Load data from the read stream, accounting for the offset bytesRead = CFReadStreamRead(info->readStream, info->buffer + offset, kMyBufferSize - offset); if (bytesRead < 0) { fprintf(stderr, "CFReadStreamRead returned %ld\n", bytesRead); break; } else if (bytesRead == 0) { break; } bufSize = bytesRead + offset; totalBytesRead += bufSize; //下载整个目录并且解析 do { bufRemaining = info->buffer + totalBytesConsumed; bytesConsumed = CFFTPCreateParsedResourceListing(NULL, bufRemaining, bufSize, &parsedDict); if (bytesConsumed > 0) { // Make sure CFFTPCreateParsedResourceListing was able to properly // parse the incoming data if (parsedDict != NULL) { // ...Print out data from parsedDict... CFRelease(parsedDict); } totalBytesConsumed += bytesConsumed; bufSize -= bytesConsumed; info->leftOverByteCount = bufSize; } else if (bytesConsumed == 0) { // This is just in case. It should never happen due to the large buffer size info->leftOverByteCount = bufSize; totalBytesRead -= info->leftOverByteCount; memmove(info->buffer, bufRemaining, info->leftOverByteCount); } else if (bytesConsumed == -1) { fprintf(stderr, "CFFTPCreateParsedResourceListing parse failure\n"); // ...Break loop and cleanup... } } while (bytesConsumed > 0);
使用网络诊断
case kCFStreamEventErrorOccurred: CFNetDiagnosticRef diagRef = CFNetDiagnosticCreateWithStreams(NULL, stream, NULL); (void)CFNetDiagnosticDiagnoseProblemInteractively(diagRef); CFStreamError error = CFReadStreamGetError(stream); reportError(error); CFReadStreamClose(stream); CFRelease(stream); break;
发表评论
-
URL System Programming Guide
2014-11-11 09:44 1227支持五种协议:ftp:// http:// ... -
Runtime programming guide
2014-10-26 01:23 1117objective-c有两个版本的ru ... -
OpenGL Programming Guide
2013-04-16 10:10 0XXXXXX -
Location Awareness Programming Guide
2013-04-14 12:19 0两个核心的framework: Cor ... -
Audio Session Programming Guide
2013-04-11 20:32 2919Audio Session:自己开发的应用和IOS应用程序处理 ... -
Event programming guide
2013-04-09 19:02 2132Phone中处理触摸屏的操作,在3.2之前是主要使用的是由UI ... -
Instruments User Guide
2013-04-02 19:32 0打开Instruments方式: 1:Xcode > O ... -
bundle programing guide
2013-03-31 10:50 3445CF 意思是Core Foundation bundle在i ... -
Core Data Tutorial
2013-03-20 15:20 1567core data支持IOS 3以后的系统。 Core Dat ... -
ios 国际化
2013-03-19 16:25 0需要你本身的应用支持国际化,主要是project->in ... -
view controller program guide
2013-03-13 13:22 0navigation controller A view c ... -
ad hoc证书
2013-02-28 23:22 1684iOS证书分2种,1种是开发证书,用来给你(开发人员)做真机测 ... -
iOS App Programming Guide
2013-03-13 11:24 2768用户界面的选择: 1:堆积方式:sdk提供的控件,你一个一个往 ... -
使用vpn在mac
2013-02-25 19:25 0http://blog.sina.com.cn/s/blog_ ... -
为APNS制作和生成证书
2013-02-25 17:32 0首先制作一个证书申请文件(.csr)文件,然后创建一个appi ... -
安装苹果的ipa文件到iphone
2013-02-22 17:29 3350苹果的ipa文件安装方式有好多种,我介绍的是最常用的安装ipa ... -
About the Tools Workflow for iOS
2013-02-26 21:51 2155查看自己的开发角色是agent、admin、member。 只 ... -
基本概念
2013-02-21 22:27 0ios开发准备流程:http://hi.baidu.com/s ... -
About the iOS Technologies(关于 iOS 技术简介)
2013-02-21 14:30 993官方文档:https://developer.apple.co ... -
Doxygen for Xcode
2013-02-21 10:53 1903IOS Developer Library 中的article ...
相关推荐
CFNetwork Programming Guide详细介绍了iphone网络开发各个方面。从BSD socket 到 CFFTP CFHTTP等等。
CFNetwork Programming Guide is written in English.
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
前端分析-2023071100789
基于kinect的3D人体建模C++完整代码.cpp
搞机工具箱10.1.0.7z
GRU+informer时间序列预测(Python完整源码和数据),python代码,pytorch架构,适合各种时间序列直接预测。 适合小白,注释清楚,都能看懂。功能如下: 代码基于数据集划分为训练集测试集。 1.多变量输入,单变量输出/可改多输出 2.多时间步预测,单时间步预测 3.评价指标:R方 RMSE MAE MAPE,对比图 4.数据从excel/csv文件中读取,直接替换即可。 5.结果保存到文本中,可以后续处理。 代码带数据,注释清晰,直接一键运行即可,适合新手小白。
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
基于ANSYS LSDyna的DEM-SPH-FEM耦合模拟滑坡入水动态行为研究,基于ANSYS LSDyna的DEM-SPH-FEM耦合的滑坡入水模拟分析研究,基于ansys lsdyna的滑坡入水模拟dem-sph-fem耦合 ,基于ANSYS LSDyna; 滑坡入水模拟; DEM-SPH-FEM 耦合,基于DEM-SPH-FEM耦合的ANSYS LSDyna滑坡入水模拟
auto_gptq-0.6.0-cp311-cp311-manylinux_2_17_x86_64.manylinux2014_x86_64.whl
复件 复件 建设工程可行性研究合同[示范文本].doc
13考试真题最近的t64.txt
好用我已经解决报错问题
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
auto_gptq-0.4.2-cp38-cp38-win_amd64.whl
自动立体库设计方案.pptx
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
在日常的工作和学习中,你是否常常为处理复杂的数据、生成高质量的文本或者进行精准的图像识别而烦恼?DeepSeek 或许就是你一直在寻找的解决方案!它以其高效、智能的特点,在各个行业都展现出了巨大的应用价值。然而,想要充分发挥 DeepSeek 的优势,掌握从入门到精通的知识和技能至关重要。本文将从实际应用的角度出发,为你详细介绍 DeepSeek 的基本原理、操作方法以及高级技巧。通过系统的学习,你将能够轻松地运用 DeepSeek 解决实际问题,提升工作效率和质量,让自己在职场和学术领域脱颖而出。现在,就让我们一起开启这场实用又高效的学习之旅吧!
# 踏入C语言的奇妙编程世界 在编程的广阔宇宙中,C语言宛如一颗璀璨恒星,以其独特魅力与强大功能,始终占据着不可替代的地位。无论你是编程小白,还是有一定基础想进一步提升的开发者,C语言都值得深入探索。 C语言的高效性与可移植性令人瞩目。它能直接操控硬件,执行速度快,是系统软件、嵌入式开发的首选。同时,代码可在不同操作系统和硬件平台间轻松移植,极大节省开发成本。 学习C语言,能让你深入理解计算机底层原理,培养逻辑思维和问题解决能力。掌握C语言后,再学习其他编程语言也会事半功倍。 现在,让我们一起开启C语言学习之旅。这里有丰富教程、实用案例、详细代码解析,助你逐步掌握C语言核心知识和编程技巧。别再犹豫,加入我们,在C语言的海洋中尽情遨游,挖掘无限可能,为未来的编程之路打下坚实基础!