注册 登录
主题 : 网络编程总结
级别: 新手上路
UID: 29631
精华: 1
发帖: 29
可可豆: 296 CB
威望: 296 点
在线时间: 157(时)
注册时间: 2010-09-03
最后登录: 2016-08-06
0 楼:  发表于: 2010-09-03 22:29    发自: Web Page
来源于 一般讨论 分类

网络编程总结   

管理提醒: 本帖被 gagaga 设置为精华(2011-01-18)
一:确认网络环境3G/WIFI N%`Eq@5  
>5-]Ur~  
    1. 添加源文件和framework 5P <  F  
     wz]  OM  
    开发Web等网络应用程序的时候,需要确认网络环境,连接情况等信息。如果没有处理它们,是不会通过Apple的审查的。 mH09* Z  
    Apple 的 例程 Reachability 中介绍了取得/检测网络状态的方法。要在应用程序程序中使用Reachability,首先要完成如下两部: $kk!NAW  
     h3 :dO|Z  
    1.1. 添加源文件: (6\ H~  
    在你的程序中使用 Reachability 只须将该例程中的 Reachability.h 和 Reachability.m 拷贝到你的工程中。如下图: 5VPP 2;J  
M kadl<  
     j*;/Cah]k  
     w`OHNwXh#I  
    1.2.添加framework: D*#r V P  
    将SystemConfiguration.framework 添加进工程。如下图: v:$Y |mh  
     18U CZ;)>  
     :j0r~*z-  
    2. 网络状态 nLjo3yvV..  
     9}6^5f?|  
    Reachability.h中定义了三种网络状态: [-Dl,P=  
    typedef enum { 1(z+*`"WB&  
        NotReachable = 0,            //无连接 0UT2sM$  
        ReachableViaWiFi,            //使用3G/GPRS网络 &4O0}ax*Zm  
        ReachableViaWWAN            //使用WiFi网络 JMq00_  
    } NetworkStatus; *n %J#[e(  
     L3- tD67oa  
    因此可以这样检查网络状态: ;1 02ddRV  
_*Z2</5   
    Reachability *r = [Reachability reachabilityWithHostName:@“www.apple.com”]; ,HdFE|  
    switch ([r currentReachabilityStatus]) { N;6WfdA-  
            case NotReachable: sx0:g?F3j  
                    // 没有网络连接 5:H9B  
                    break; xl$#00|y  
            case ReachableViaWWAN: jE{2rw$ZJ?  
                    // 使用3G网络 %%w]-`^h,  
                    break; 0oi =} lV  
            case ReachableViaWiFi: PDcZno?  
                    // 使用WiFi网络 Y +tXWN"8  
                    break; O2Mo ~}  
    } 7=ZB?@bU~  
     {^#62Y  
    3.检查当前网络环境 'L2M  W  
    程序启动时,如果想检测可用的网络环境,可以像这样 j5:{H4?  
    // 是否wifi }GCt)i_  
    + (BOOL) IsEnableWIFI { l&4TfzkY  
        return ([[Reachability reachabilityForLocalWiFi] currentReachabilityStatus] != NotReachable); vO2o/   
    } +`x8[A)-  
"oYyeT ,?  
    // 是否3G NVMhbpX6  
    + (BOOL) IsEnable3G {  mq?5|`  
        return ([[Reachability reachabilityForInternetConnection] currentReachabilityStatus] != NotReachable); TK;*:K8oe  
    } !#nlWX :~  
    例子: %Y` @>P'  
    - (void)viewWillAppear:(BOOL)animated {     zZ|Si  
    if (([Reachability reachabilityForInternetConnection].currentReachabilityStatus == NotReachable) && j#b?P=|l  
            ([Reachability reachabilityForLocalWiFi].currentReachabilityStatus == NotReachable)) { DH_Mll>  
            self.navigationItem.hidesBackButton = YES; z2&SZ.mk  
            [self.navigationItem setLeftBarButtonItem:nil animated:NO]; XX,iT~+-  
        } Q- %Q7n'c  
    } 0f 1Lu) 2  
3I?? K)Yl  
    4. 链接状态的实时通知 ":*PC[)W  
    网络连接状态的实时检查,通知在网络应用中也是十分必要的。接续状态发生变化时,需要及时地通知用户: HZdmL-1Z^+  
     1@kPl[`p'  
    Reachability 1.5版本 s!09Pxc  
    // My.AppDelegate.h 02} &h  
    #import "Reachability.h" 8ltHR]v  
;5A&[]@^^@  
    @interface MyAppDelegate : NSObject <UIApplicationDelegate> { Z xLjh  
        NetworkStatus remoteHostStatus; SU9#Y|I  
    } !Ljs9 =UF  
o*\kg+8  
    @property NetworkStatus remoteHostStatus; |8 h<Ls_  
h FP$MFab  
    @end I;L $Nf{v  
j[yGfDb  
    // My.AppDelegate.m 86~HkHliv  
    #import "MyAppDelegate.h" Rs:<'A  
l0g#&V--  
    @implementation MyAppDelegate )]!Ps` ,u  
    @synthesize remoteHostStatus; _n2PoE:5@P  
gqJ&Q t#f  
    // 更新网络状态 ~ -Rr[O=E  
    - (void)updateStatus { *L/_ v  
        self.remoteHostStatus = [[Reachability sharedReachability] remoteHostStatus]; *"0Yr`)S  
    } *J?QXsg  
6z"fBF  
    // 通知网络状态 BG"~yyKA  
    - (void)reachabilityChanged:(NSNotification *)note { A L}c-#GG  
        [self updateStatus]; &TSt/b/+W  
        if (self.remoteHostStatus == NotReachable) { dx[<@f2c  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:NSLocalizedString(@"AppName", nil) 0^|)[2m!  
                         message:NSLocalizedString (@"NotReachable", nil) /H@k;o  
                        delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; &Hc8u,|  
            [alert show]; OibW 8A4Z1  
            [alert release]; {J%hTjCw  
        } /]T#@>('  
    } U}6'_ PRQ  
NDU,9A.P  
    // 程序启动器,启动网络监视 ,m!j2H}8  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { G!oq ;<  
     9">}@1k  
        // 设置网络检测的站点 t</rvAH E  
        [[Reachability sharedReachability] setHostName:@"www.apple.com"]; Q}W6?XDu  
        [[Reachability sharedReachability] setNetworkStatusNotificationsEnabled:YES]; B>t$Z5Q^X  
        // 设置网络状态变化时的通知函数 IO`.]iG  
        [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(reachabilityChanged:) d37l/I  
                                                 name:@"kNetworkReachabilityChangedNotification" object:nil]; s7SW4ff1  
        [self updateStatus]; 4CS 9vv)9R  
    } `.Y["f 1B  
+%6{>C+bZo  
    - (void)dealloc { t'_Hp},  
        // 删除通知对象 b'O>&V`  
        [[NSNotificationCenter defaultCenter] removeObserver:self]; A(W%G|+  
        [window release]; FsY}mql  
        [super dealloc]; S,lJ&Rsu  
    } q>%KIBh(  
     >yg mE`g  
    Reachability 2.0版本 /P5w}n  
     7NMQUN7k '  
NM/?jF@j*  
    // MyAppDelegate.h q0.+F4  
    @class Reachability; IBf&'/ 8\  
$=4T# W=m  
        @interface MyAppDelegate : NSObject <UIApplicationDelegate> { 7tfMD(Q]e/  
            Reachability  *hostReach; CwTx7 ^qa  
        } .Hl]xI$;+  
m-dne/%_  
    @end #c'yAa  
e4yd n  
    // MyAppDelegate.m 8uM>UpX  
    - (void)reachabilityChanged:(NSNotification *)note { 8V;@yzI ha  
        Reachability* curReach = [note object]; IBcCbNs!  
        NSParameterAssert([curReach isKindOfClass: [Reachability class]]); f`.8.1Rd  
        NetworkStatus status = [curReach currentReachabilityStatus]; &kHp}\  
     m7zen530  
        if (status == NotReachable) { VThcG( NF  
            UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"AppName"" @T._   
                              message:@"NotReachable" GX&BUP\  
                              delegate:nil gV):3mWC  
                              cancelButtonTitle:@"YES" otherButtonTitles:nil]; M3odyO(  
                              [alert show]; s&iM. [k  
                              [alert release]; 4v33{sp  
        } G6w&C^J*8>  
    } Lz2wOB1Zc+  
                               _Buwz_[&  
    - (void)applicationDidFinishLaunching:(UIApplication *)application { }BK Ez[G(  
        // ... j5|_S QOmt  
                   JC(rSs*  
        // 监测网络情况 =zDU!< U  
        [[NSNotificationCenter defaultCenter] addObserver:self \-0@9E<D  
                              selector:@selector(reachabilityChanged:) 6B)(kPW  
                              name: kReachabilityChangedNotification `$ZX]6G  
                              object: nil]; 4[ M! x  
        hostReach = [[Reachability reachabilityWithHostName:@"www.google.com"] retain]; }tF/ca:XPQ  
        hostReach startNotifer]; gYA|JFi  
        // ... %2f``48#  
    } $\Bzp<SN`  
|Up+Kc:z/n  
3xxQL,FV  
二:使用NSConnection下载数据 x9Y1v1!5Pu  
     wdS^`nz|  
    1.创建NSConnection对象,设置委托对象 =MEv{9_  
     F^ 7qLvh  
    NSMutableURLRequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:[self urlString]]]; ~YA* RCe  
    [NSURLConnection connectionWithRequest:request delegate:self]; h$)(-_c3  
     &M,a+|yuY  
    2. NSURLConnection delegate委托方法 -$f~V\M  
        - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response;   L@HPU;<  
        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error;   k<Z^93 S  
        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data;   x9Fga_  
        - (void)connectionDidFinishLoading:(NSURLConnection *)connection;   q&Y'zyHLP  
[mn@/qf  
    3. 实现委托方法 {E-.W"t4  
    - (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response { PEac0rSW  
        // store data t 9&xk?%{  
        [self.receivedData setLength:0];            //通常在这里先清空接受数据的缓存 L{jJDd  
    } :'91qA%Wr  
     _T&?H&#  
    - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data { p @&>{hi@  
           /* appends the new data to the received data */ 1 !bODd  
        [self.receivedData appendData:data];        //可能多次收到数据,把新的数据添加在现有数据最后 J 05@SG':  
    } <k<K"{  
HYyO/U9z|I  
    - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error { >G $8\ &]j  
        // 错误处理 <+o-{{ E[  
    } t.$3?"60~  
vH%AXz IA  
    - (void)connectionDidFinishLoading:(NSURLConnection *)connection { y  >r7(qg  
        // disconnect mEfI2P)#|  
        [UIApplication sharedApplication].networkActivityIndicatorVisible = NO;   hEi]-N\X  
        NSString *returnString = [[NSString alloc] initWithData:self.receivedData encoding:NSUTF8StringEncoding]; Py$Q]s?\1  
        NSLog(returnString);  B8UtD  
        [self urlLoaded:[self urlString] data:self.receivedData]; L6./b;  
        firstTimeDownloaded = YES; k__iJsk  
    } k{;"Aj:iL  
/:3:Ky3  
三:使用NSXMLParser解析xml文件 bXF>{%(}E  
A-^[4&rb  
    1. 设置委托对象,开始解析 M$~3`n*^  
    NSXMLParser *parser = [[NSXMLParser alloc] initWithData:data];   //或者也可以使用initWithContentsOfURL直接下载文件,但是有一个原因不这么做: rZ2X$FO@  
    // It's also possible to have NSXMLParser download the data, by passing it a URL, but this is not desirable @X4Ur+d  
    // because it gives less control over the network, particularly in responding to connection errors. $h`(toTyF  
    [parser setDelegate:self]; T6h-E^Z  
    [parser parse]; <cNXe4(  
nDu f<mw  
    2. 常用的委托方法 GL[#XB> n  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName SNV~;@(h  
                                namespaceURI:(NSString *)namespaceURI _*7h1[,{f  
                                qualifiedName:(NSString *)qName _BO:~x  
                                attributes:(NSDictionary *)attributeDict; L`;p.L Bs_  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName ig<Eyr  
                                namespaceURI:(NSString *)namespaceURI C,~wmS )@  
                                qualifiedName:(NSString *)qName; GmP)"@O](;  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string; gyj.M`+y  
    - (void)parser:(NSXMLParser *)parser parseErrorOccurred:(NSError *)parseError; S-} MS"  
_x &;Fa%  
    static NSString *feedURLString = @"http://www.yifeiyang.net/test/test.xml"; u.sF/T=6f  
l9KL P  
    3.  应用举例 >J [Bf9)>  
    - (void)parseXMLFileAtURL:(NSURL *)URL parseError:(NSError **)error 0B fqEAl  
    { k"D6Vyy`  
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL]; jWJq[ l  
        [parser setDelegate:self]; 3:@2gp!tq  
        [parser setShouldProcessNamespaces:NO]; .) uUpY%K^  
        [parser setShouldReportNamespacePrefixes:NO]; to,DN2rN  
        [parser setShouldResolveExternalEntities:NO]; *GleeJWz  
        [parser parse]; F-[zuYGp  
        NSError *parseError = [parser parserError]; Hy ^E m  
        if (parseError && error) { Ko_Sx.  
            *error = parseError; T6m#sVq  
        } IROX]f}r(  
        [parser release]; ma9q?H#X  
    } W2/FGJD  
r8g4NsRVtv  
    - (void)parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI d~F`q7F'?]  
                                        qualifiedName:(NSString*)qName attributes:(NSDictionary *)attributeDict{ F1)B-wW  
        // 元素开始句柄 K]ob>wPf  
        if (qName) { I$/*Pt];  
            elementName = qName; ph{p[QI:{X  
        } b&[9m\AX`  
        if ([elementName isEqualToString:@"user"]) { qX{"R.d  
            // 输出属性值 QA>(}u\+  
            NSLog(@"Name is %@ , Age is %@", [attributeDict objectForKey:@"name"], [attributeDict objectForKey:@"age"]); %E#OUo[y/  
        } W&CQ87b  
    } .] mYpz  
Cw42bO  
    - (void)parser:(NSXMLParser *)parser didEndElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI 5OeTOI()&5  
                                        qualifiedName:(NSString *)qName x2x) y08  
    { CT,caa  
        // 元素终了句柄 ^ CVhV  
        if (qName) { u$ C@0d  
               elementName = qName; **_`AM~  
        } Atsi}zTR\  
    } x{{QS$6v  
n X4R  
    - (void)parser:(NSXMLParser *)parser foundCharacters:(NSString *)string pYZ6-s  
    { _nu,ks+  
        // 取得元素的text ^,u0kMG5l  
    } L 08>9tf`  
,<?iL~> %  
    NSError *parseError = nil; d]1%/$v^  
    [self parseXMLFileAtURL:[NSURL URLWithString:feedURLString] parseError:&parseError]; 3D_Ky Z~M+  
     <"A|Xv'Q  
        
清空我的评分动态本帖最近评分记录: 共2条评分记录
younker 可可豆 +10 2011-07-08 优秀文章
zenny_chen 可可豆 +3 2010-09-23 很不错,呵呵
隐藏评分记录
级别: 精灵王
UID: 22435
精华: 0
发帖: 847
可可豆: 7948 CB
威望: 7895 点
在线时间: 563(时)
注册时间: 2010-06-17
最后登录: 2018-06-07
1 楼:  发表于: 2010-09-03 22:36    发自: Web Page
非常感谢LZ的无私分享!
级别: 新手上路
UID: 29631
精华: 1
发帖: 29
可可豆: 296 CB
威望: 296 点
在线时间: 157(时)
注册时间: 2010-09-03
最后登录: 2016-08-06
2 楼:  发表于: 2010-09-03 22:55    发自: Web Page
使用NSOperation和NSOperationQueue启动多线程
在app store中的很多应用程序非常的笨重,他们有好的界面,但操作性很差,比如说当程序从网上或本地载入数据的时候,界面被冻结了,用户只能等程序完全载入数据之后才能进行操作。 "M6a_rZ2W  
当打开一个应用程序时,iphone会产生一个包含main方法的线程,所用程序中的界面都是运行在这个线程之中的(table views, tab bars, alerts…),有时候我们会用数据填充这些view,现在问        题是如何有效的载入数据,并且用户还能自如的操作程序。方法是启动新的线程,专门用于数据的下载,而主线程不会因为下载数据被阻塞。 ;a!o$y  
不管使用任何编程语言,在实现多线程时都是一件很麻烦的事情。更糟糕的是,一旦出错,这种错误通常相当糟糕。然而,幸运的是apple从os x10.5在这方面做了很多的改进,NSThread的引入,使得开发多线程应用程序容易多了。除此之外,它们还引入了两个全新的类,NSOperation和NSOperationQueue。 G B!3` A%&  
接下来我们通过一个实例来剖析如何使用这两个类实现多线程。这里指示展示这两个类的基本用法,当然这不是使用他们的唯一办法。 x ( w <U1  
如果你熟悉java或者它的别的变种语言的话 ,你会发现NSOperation对象很像java.lang.Runnable接口,就像java.lang.Runnable接口那样,NSOperation类也被设计为可扩展的,而且只有一个需要重写的方法。它就是-(void)main。使用NSOperation的最简单的方式就是把一个NSOperation对象加入到NSOperationQueue队列中,一旦这个对象被加入到队列,队列就开始处理这个对象,直到这个对象的所有操作完成。然后它被队列释放。 c 5P52_@  
下面的例子中,使用一个获取网页,并对其解析程NSXMLDocument,最后将解析得到的NSXMLDocument返回给主线程。 :b>Z|7g?  
     k Fv\V   
PageLoadOperation.h@interface PageLoadOperation : NSOperation { =f@O~nGm  
    NSURL *targetURL;} T(+F6d=1  
@property(retain) NSURL *targetURL; $oE 4q6b  
- (id)initWithURL:(NSURL*)url;@end %Hv$PsS J  
T Uhp  
PageLoadOperation.m T\c;Ra  
#import "PageLoadOperation.h"#import "AppDelegate.h"@implementation PageLoadOperation@synthesize targetURL;- (id)initWithURL:(NSURL*)url;{ kN9S;o@)  
    if (![super init]) return nil; L1BpkB  
    [self setTargetURL:url]; yp 5*8g5  
    return self;}- (void)dealloc { m6V1m0M  
    [targetURL release], targetURL = nil; |Ix6D  
    [super dealloc]; T~$ePVk>L  
} IcL3.(!]l  
- (void)main ,r5<v_  
{ 1W~-C B>  
    NSString *webpageString = [[[NSString alloc] v,vTRrpK  
    initWithContentsOfURL:[self targetURL]] autorelease]; 3iYz<M  
    NSError *error = nil; [2w3c4K  
    NSXMLDocument *document = [[NSXMLDocument alloc] y- k?_$ M  
    initWithXMLString:webpageString L:YsAv  
    options:NSXMLDocumentTidyHTML error:&error]; A`(p6 H"s  
    if (!document) { "W6 nW  
        NSLog(@"%s Error loading document (%@): %@", ZJ"*A+IJx[  
        _cmd, [[self targetURL] absoluteString], error); hx4!P(o1  
         return; q`1t*<sk  
    } /6{`6(p  
    [[AppDelegate shared] C koPno  
    performSelectorOnMainThread:@selector(pageLoaded:) `Q26Dk  
         withObject:document waitUntilDone:YES]; w GZ(bKyO  
    [document release]; 7g ]]>  
} ulfpop*2  
@end }= A6Jv(j  
    正如我们所看到的那样,这个类相当的简单,在它的init方法中接受一个url并保存起来,当main函数被调用的时候,它使用这个保存的url创建一个字符串,并将这个字符串传递给NSXMLDocumentinit方法。如果加载的xml数据没有出错,数据会被传递给AppDelegate,它处于主线程中。到此,这个线程的任务就完成了。在主线程中注销操作队列的时候,会将这个NSOperation对象释放。 JmNeqpbB`w  
AppDelegate.h ?3SlvKI}H`  
@interface AppDelegate : NSObject { N)Qj^bD!  
    NSOperationQueue *queue; ([|5(Omd\  
}+ (id)shared;- (void)pageLoaded:(NSXMLDocument*)document;@endAppDelegate.m        #import "AppDelegate.h"#import "PageLoadOperation.h"@implementation AppDelegate |L;'In  
static AppDelegate *shared; }#!o^B8  
static NSArray *urlArray; UQ|0Aqwq  
- (id)init 3FPy "[[  
{ /p\Ymq  
    if (shared) UShn)3F  
    { PkDL\Nqe  
        [self autorelease]; e::5|6x  
        return shared; `^AbFV 3  
    } ?^BsR  
    if (![super init]) return nil;    NSMutableArray *array = [[NSMutableArray alloc] init];[array addObject:@"http://www.google.com"];[array addObject:@"http://www.apple.com"];[array addObject:@"http://www.yahoo.com"];[array addObject:@"http://www.zarrastudios.com"];[array addObject:@"http://www.macosxhints.com"];urlArray = array;    queue = [[NSOperationQueue alloc] init];shared = self;return self; H[@}ri<  
    } 4NR,"l)  
    •    (void)applicationDidFinishLaunching: SJU93n"G/  
    (NSNotification *)aNotification 3\=8tg p  
{ C*Ws6s>+z  
        for (NSString *urlString in urlArray) w2]1ftY  
        { mMN oR]  
        NSURL *url =  QN_5q5  
        [NSURL URLWithString:urlString];        PageLoadOperation *plo = x(}tr27o  
        [[PageLoadOperation alloc] initWithURL:url]; h83ho  
        [queue addOperation:plo]; :#TJ-l:#  
        [plo release]; vCH>Fj"7  
        } W<!q>8Xn?  
} #*S/Sh?Q  
- (void)dealloc R5]R pW=G  
{ gp-wlu4  
        [queue release], queue = nil;  (i*1M  
        [super dealloc]; 5B'-&.Aj+  
} |D]jdd@!a2  
+ (id)shared; o*p7/KvoT  
{ ""pJO 6bI  
        if (!shared) { A!^K:S:@  
            [[AppDelegate alloc] init]; KH pxWq  
        } )\mklM9Z  
        return shared; "vLqYc4$  
} tB(Q-c  
- (void)pageLoaded:(NSXMLDocument*)document; N)poe2[  
{ .6O>P2m]a_  
        NSLog(@"%s Do something with the XMLDocument: %@", 3tXtt@Yy  
             _cmd, document); p00\C  
} ]?``*{Zqy  
@end {h9#JMIA  
GsDSJz  
NSOperationQueue的并行控制(NSOperationQueue Concurrency) PNc200`v4_  
        在上面这个简单的例子中,我们很难看出这些操作是并行运行的,然而,如果你你的操作花费的时间远远比这里的要长,你将会发现,队列是同时执行这些操作的。幸运的是,如果你想要为队列限制同时只能运行几个操作,你可以使用NSOperationQueue的setMaxConcurrentOperationCount:方法。例如,[queue setMaxConcurrentOperationCount:2];
级别: 精灵王
UID: 17862
精华: 0
发帖: 553
可可豆: 5526 CB
威望: 5521 点
在线时间: 1136(时)
注册时间: 2010-04-19
最后登录: 2018-12-13
3 楼:  发表于: 2010-09-08 15:48    发自: Web Page
相当的清晰明了  先顶了  在学习
大年表示毫无压力~
级别: 侠客
UID: 13064
精华: 0
发帖: 82
可可豆: 820 CB
威望: 820 点
在线时间: 469(时)
注册时间: 2010-01-17
最后登录: 2014-03-13
4 楼:  发表于: 2010-09-17 11:57    发自: Web Page
留名  目标10个字
级别: 圣骑士
UID: 14031
精华: 0
发帖: 380
可可豆: 3669 CB
威望: 3669 点
在线时间: 1680(时)
注册时间: 2010-02-10
最后登录: 2016-08-06
5 楼:  发表于: 2010-09-17 12:36    发自: Web Page
必看贴
级别: 侠客
UID: 30926
精华: 1
发帖: 48
可可豆: 510 CB
威望: 510 点
在线时间: 47(时)
注册时间: 2010-09-16
最后登录: 2011-07-10
6 楼:  发表于: 2010-09-17 13:11    发自: Web Page
颇有参考价值,多谢楼主,收了
级别: 侠客
状态: 连续签到 - [1天]
UID: 26254
精华: 0
发帖: 97
可可豆: 924 CB
威望: 920 点
在线时间: 349(时)
注册时间: 2010-07-30
最后登录: 2018-09-19
7 楼:  发表于: 2010-09-17 14:53    发自: Web Page
mark
http://simg.cocoachina.com/201110130152451431.jpg
级别: 圣骑士
UID: 9506
精华: 0
发帖: 434
可可豆: 4110 CB
威望: 4110 点
在线时间: 2434(时)
注册时间: 2009-10-05
最后登录: 2016-08-01
8 楼:  发表于: 2010-09-17 17:53    发自: Web Page
是不是差一个wiki系统,方便把自己的心得整理出来。
级别: 侠客
状态: 连续签到 - [3天]
UID: 23185
精华: 0
发帖: 140
可可豆: 1317 CB
威望: 1311 点
在线时间: 744(时)
注册时间: 2010-06-26
最后登录: 2015-05-14
9 楼:  发表于: 2010-09-17 19:26    发自: Web Page
mark 重点学习了

CocoaChina社区转载内容已尽可能注明出处,如未能核实来源或转发内容图片有权利瑕疵的,请及时联系社区进行修改或删除【联系方式QQ : 3442093904 邮箱:support@cocoachina.com】文章内容为作者独立观点,不代表CocoaChina社区立场。版权归原作者所有,如申请授权请联系作者,因文章侵权CocoaChina社区不承担任何法律及连带责任。

描述
快速回复

关注本帖(如果有新回复会站内信通知您)

发帖、回帖都会得到可观的积分奖励。查看论坛积分规则

按"Ctrl+Enter"直接提交
    顶部