仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1393|回复: 10
打印 上一主题 下一主题

[学习教程] IOS编程之Android事务传送机制仓酷云

[复制链接]
谁可相欹 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-18 11:27:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
视图是仪表盘模型是发动机控制器是控制芯片CoreData---管理数据OBJC刚学的时候觉得CD很高深其实他是最容易用的库之一实行情况



  • OSX10.9
  • Eclipse(ADT)
  • Android源码版本:APILevel19(Android4.4)
Android事务组成

在Android中,事务次要包含点按、长按、拖拽、滑动等,点按又包含单击和双击,别的还包含单指操纵和多指操纵。一切这些都组成了Android中的事务呼应。总的来讲,一切的事务都由以下三个部分作为基本:


  • 按下(ACTION_DOWN)
  • 挪动(ACTION_MOVE)
  • 抬起(ACTION_UP)
一切的操纵事务起首必需实行的是按下操纵(ACTIONDOWN),以后一切的操纵都是以按下操纵作为条件,当按下操纵完成后,接上去多是一段挪动(ACTIONMOVE)然后抬起(ACTION_UP),大概是按下操纵实行完成后没有挪动就间接抬起。这一系列的举措在Android中都能够举行把持。
我们晓得,一切的事务操纵都产生在触摸屏上,而在屏幕上与我们交互的就是林林总总的视图组件(View),在Android中,一切的视图都承继于View,别的经由过程各类结构组件(ViewGroup)来对View举行结构,ViewGroup也承继于View。一切的UI控件比方Button、TextView都是承继于View,而一切的结构控件比方RelativeLayout、容器控件比方ListView都是承继于ViewGroup。以是,我们的事务操纵次要就是产生在View和ViewGroup之间,那末View和ViewGroup中次要有哪些办法来对这些事务举行呼应呢?记着以下3个办法,我们经由过程检察View和ViewGroup的源码能够看到:
View.java
  1. publicbooleandispatchTouchEvent(MotionEventevent)publicbooleanonTouchEvent(MotionEventevent)
复制代码
ViewGroup.java
  1. publicbooleandispatchTouchEvent(MotionEventevent)publicbooleanonTouchEvent(MotionEventevent)publicbooleanonInterceptTouchEvent(MotionEventevent)
复制代码
在View和ViewGroup中都存在dispatchTouchEvent和onTouchEvent办法,可是在ViewGroup中另有一个onInterceptTouchEvent办法,那这些办法都是干吗的呢?别急,我们先看看他们的前往值。这些办法的前往值全体都是boolean型,为何是boolean型呢,看看本文的题目,“事务传送”,传送的历程就是一个接一个,那到了某一个点后是不是要持续往下传送呢?你发明了吗,“是不是”二字就决意了这些办法应当用boolean来作为前往值。没错,这些办法都前往true大概是false。在Android中,一切的事务都是从入手下手经由传送到完成事务的消耗,这些办法的前往值就决意了某一事务是不是是持续往下传,仍是被拦阻了,或是被消耗了。
接上去就是这些办法的参数,都承受了一个MotionEvent范例的参数,MotionEvent承继于InputEvent,用于标志各类举措事务。之条件到的ACTIONDOWN、ACTIONMOVE、ACTION_UP都是MotinEvent中界说的常量。我们经由过程MotionEvent传出去的事务范例来判别吸收的是哪种范例的事务。到如今,这三个办法的前往值和参数你应当都分明了,接上去就注释一下这三个办法分离在甚么时分处置事务。


  • dispatchTouchEvent办法用于事务的分发,Android中一切的事务都必需经由这个办法的分发,然后决意是本身消耗以后事务仍是持续往下分发给子控件处置。前往true暗示不持续分发,事务没有被消耗。前往false则持续往下分发,假如是ViewGroup则分发给onInterceptTouchEvent举行判别是不是拦阻该事务。
  • onTouchEvent办法用于事务的处置,前往true暗示消耗处置以后事务,前往false则不处置,交给子控件举行持续分发。
  • onInterceptTouchEvent是ViewGroup中才有的办法,View中没有,它的感化是卖力事务的拦阻,前往true的时分暗示拦阻以后事务,不持续往下分发,交给本身的onTouchEvent举行处置。前往false则不拦阻,持续往下传。这是ViewGroup独有的办法,由于ViewGroup中大概另有子View,而在Android中View中是不克不及再包括子View的(iOS能够)。
到今朝为止,Android中事务的组成和事务处置办法的感化你应当对照分明了,接上去我们就经由过程一个Demo来实践体验实行一下。
Android事务处置

起首在Eclipse新建一个工程,并新建一个类RTButton承继Button,用来完成我们对按钮事务的跟踪。
RTButton.java
  1. publicclassRTButtonextendsButton{publicRTButton(Contextcontext,AttributeSetattrs){super(context,attrs);}@OverridepublicbooleandispatchTouchEvent(MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN:System.out.println("RTButton---dispatchTouchEvent---DOWN");break;caseMotionEvent.ACTION_MOVE:System.out.println("RTButton---dispatchTouchEvent---MOVE");break;caseMotionEvent.ACTION_UP:System.out.println("RTButton---dispatchTouchEvent---UP");break;default:break;}returnsuper.dispatchTouchEvent(event);}@OverridepublicbooleanonTouchEvent(MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN:System.out.println("RTButton---onTouchEvent---DOWN");break;caseMotionEvent.ACTION_MOVE:System.out.println("RTButton---onTouchEvent---MOVE");break;caseMotionEvent.ACTION_UP:System.out.println("RTButton---onTouchEvent---UP");break;default:break;}returnsuper.onTouchEvent(event);}}
复制代码
在RTButton中我重写了dispatchTouchEvent和onTouchEvent办法,并猎取了MotionEvent各个事务形态,打印输入了每个形态下的信息。然后在activity_main.xml中间接在根结构下放进自界说的按钮RTButton。
activity_main.xml
  1. <LinearLayoutxmlns:android="http://schemas.android.com/apk/res/android"xmlns:tools="http://schemas.android.com/tools"android:id="@+id/myLayout"android:layout_width="match_parent"android:layout_height="match_parent"><com.ryantang.eventdispatchdemo.RTButtonandroid:id="@+id/btn"android:layout_width="match_parent"android:layout_height="wrap_content"android:text="Button"/></LinearLayout>
复制代码
接上去在Activity中为RTButton设置onTouch和onClick的监听器来跟踪事务传送的历程,别的,Activity中也有一个dispatchTouchEvent办法和一个onTouchEvent办法,我们也重写他们并输入打印信息。
MainActivity.java
  1. publicclassMainActivityextendsActivity{privateRTButtonbutton;@OverrideprotectedvoidonCreate(BundlesavedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);button=(RTButton)this.findViewById(R.id.btn);button.setOnTouchListener(newOnTouchListener(){@OverridepublicbooleanonTouch(Viewv,MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN:System.out.println("RTButton---onTouch---DOWN");break;caseMotionEvent.ACTION_MOVE:System.out.println("RTButton---onTouch---MOVE");break;caseMotionEvent.ACTION_UP:System.out.println("RTButton---onTouch---UP");break;default:break;}returnfalse;}});button.setOnClickListener(newOnClickListener(){@OverridepublicvoidonClick(Viewv){System.out.println("RTButtonclicked!");}});}@OverridepublicbooleandispatchTouchEvent(MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN:System.out.println("Activity---dispatchTouchEvent---DOWN");break;caseMotionEvent.ACTION_MOVE:System.out.println("Activity---dispatchTouchEvent---MOVE");break;caseMotionEvent.ACTION_UP:System.out.println("Activity---dispatchTouchEvent---UP");break;default:break;}returnsuper.dispatchTouchEvent(event);}@OverridepublicbooleanonTouchEvent(MotionEventevent){switch(event.getAction()){caseMotionEvent.ACTION_DOWN:System.out.println("Activity---onTouchEvent---DOWN");break;caseMotionEvent.ACTION_MOVE:System.out.println("Activity---onTouchEvent---MOVE");break;caseMotionEvent.ACTION_UP:System.out.println("Activity---onTouchEvent---UP");break;default:break;}returnsuper.onTouchEvent(event);}}
复制代码
代码部分已完成了,接上去运转工程,并点击按钮,检察日记输入信息,我们能够看到以下了局:

<br>
经由过程日记输入能够看到,起首实行了Activity的dispatchTouchEvent办法举行事务分发,在MainActivity.java代码第55行,dispatchTouchEvent办法的前往值是super.dispatchTouchEvent(event),因而挪用了父类办法,我们进进Activity.java的源码中看看详细完成。
Activity.java
  1. /***Calledtoprocesstouchscreenevents.Youcanoverridethisto*interceptalltouchscreeneventsbeforetheyaredispatchedtothe*window.Besuretocallthisimplementationfortouchscreenevents*thatshouldbehandlednormally.**@paramevThetouchscreenevent.**@returnbooleanReturntrueifthiseventwasconsumed.*/publicbooleandispatchTouchEvent(MotionEventev){if(ev.getAction()==MotionEvent.ACTION_DOWN){onUserInteraction();}if(getWindow().superDispatchTouchEvent(ev)){returntrue;}returnonTouchEvent(ev);}
复制代码
从源码中能够看到,dispatchTouchEvent办法只处置了ACTIONDOWN事务,后面提到过,一切的事务都是以按下为出发点的,以是,Android以为当ACTIONDOWN事务没有实行时,前面的事务都是没成心义的,以是这里起首判别ACTION_DOWN事务。假如事务建立,则挪用了onUserInteraction办法,该办法能够在Activity中被重写,在事务被分发前会挪用该办法。该办法的前往值是void型,不会对事务传送了局形成影响,接着会判别getWindow().superDispatchTouchEvent(ev)的实行了局,看看它的源码:
Activity.java
  1. /***Usedbycustomwindows,suchasDialog,topassthetouchscreenevent*furtherdowntheviewhierarchy.Applicationdevelopersshould*notneedtoimplementorcallthis.**/publicabstractbooleansuperDispatchTouchEvent(MotionEventevent);
复制代码
经由过程源码正文我们能够懂得到这是个笼统办法,用于自界说的Window,比方自界说Dialog传送触屏事务,而且提到开辟者不必要往完成或挪用该办法,体系会完成,假如我们在MainActivity中将dispatchTouchEvent办法的前往值设为true,那末这里的实行了局就为true,从而不会前往实行onTouchEvent(ev),假如这里前往false,那末终极会前往实行onTouchEvent办法,由此可知,接上去要挪用的就是onTouchEvent办法了。别急,经由过程日记输入信息能够看到,ACTION_DOWN事务从Activity被分发到了RTButton,接着实行了onTouch和onTouchEvent办法,为何先实行onTouch办法呢?我们到RTButton中的dispatchTouchEvent看看View中的源码是怎样处置的。
View.java
  1. /***Passthetouchscreenmotioneventdowntothetargetview,orthis*viewifitisthetarget.**@parameventThemotioneventtobedispatched.*@returnTrueiftheeventwashandledbytheview,falseotherwise.*/publicbooleandispatchTouchEvent(MotionEventevent){if(mInputEventConsistencyVerifier!=null){mInputEventConsistencyVerifier.onTouchEvent(event,0);}if(onFilterTouchEventForSecurity(event)){//noinspectionSimplifiableIfStatementListenerInfoli=mListenerInfo;if(li!=null&&li.mOnTouchListener!=null&&(mViewFlags&ENABLED_MASK)==ENABLED&&li.mOnTouchListener.onTouch(this,event)){returntrue;}if(onTouchEvent(event)){returntrue;}}if(mInputEventConsistencyVerifier!=null){mInputEventConsistencyVerifier.onUnhandledEvent(event,0);}returnfalse;}
复制代码
选择关头代码举行剖析,能够看代码第16行,这里有几个前提,当几个前提都满意时该办法就前往true,当前提li.mOnTouchListener不为空时,经由过程在源码中查找,发明mOnTouchListener是在以下办法中举行设置的。
View.java
  1. /***Registeracallbacktobeinvokedwhenatoucheventissenttothisview.*@paramlthetouchlistenertoattachtothisview*/publicvoidsetOnTouchListener(OnTouchListenerl){getListenerInfo().mOnTouchListener=l;}
复制代码
这个办法就已很熟习了,就是我们在MainActivity.java中为RTButton设置的onTouchListener,前提(mViewFlags&ENABLED_MASK)==ENABLED判别的是以后View是不是是ENABLE的,默许都是ENABLE形态的。接着就是li.mOnTouchListener.onTouch(this,event)前提,这里挪用了onTouch办法,该办法的挪用就是我们在MainActivity.java中为RTButton设置的监听回调,假如该办法前往true,则全部前提都满意,dispatchTouchEvent就前往true,暗示该事务就不持续向下分发了,由于已被onTouch消耗了。
假如onTouch前往的是false,则这个判别前提不建立,接着实行onTouchEvent(event)办法举行判别,假如该办法前往true,暗示事务被onTouchEvent处置了,则全部dispatchTouchEvent就前往true。到这里,我们就能够回覆之条件出的“为何先实行onTouch办法”的成绩了。到今朝为止,ACTIONDOWN的事务经由了从Activity到RTButton的分发,然后经由onTouch和onTouchEvent的处置,终极,ACTIONDOWN事务交给了RTButton得onTouchEvent举行处置。
当我们的手(我这里用的Genymotion然后用鼠标举行的操纵,用手的话大概会实行一些ACTIONMOVE操纵)从屏幕抬起时,会产生ACTIONUP事务。从之前输入的日记信念中能够看到,ACTIONUP事务一样从Activity入手下手到RTButton举行分发和处置,最初,因为我们注册了onClick事务,当onTouchEvent实行终了后,就挪用了onClick事务,那末onClick是在那里被挪用的呢?持续回到View.java的源代码中寻觅。因为onTouchEvent在View.java中的源码对照长,这里就不贴出来了,感乐趣的能够本人往研讨一下,经由过程源码浏览,我们在ACTIONUP的处置分支中能够看到一个performClick()办法,从这个办法的源码中能够看到实行了哪些操纵。
View.java
  1. /***CallthisviewsOnClickListener,ifitisdefined.Performsallnormal*actionsassociatedwithclicking:reportingaccessibilityevent,playing*asound,etc.**@returnTruetherewasanassignedOnClickListenerthatwascalled,false*otherwiseisreturned.*/publicbooleanperformClick(){sendAccessibilityEvent(AccessibilityEvent.TYPE_VIEW_CLICKED);ListenerInfoli=mListenerInfo;if(li!=null&&li.mOnClickListener!=null){playSoundEffect(SoundEffectConstants.CLICK);li.mOnClickListener.onClick(this);returntrue;}returnfalse;}
复制代码
在if分支里能够看到实行了li.mOnClickListener.onClick(this);这句代码,这里就实行了我们为RTButton完成的onClick办法,以是,到今朝为止,能够回覆前一个“onClick是在那里被挪用的呢?”的成绩了,onClick是在onTouchEvent中被实行的,而且,onClick要后于onTouch的实行。
到此,点击按钮的事务传送就停止了,我们分离源代码窥伺了个中的实行细节,假如我们修正各个事务把持办法的前往值又会产生甚么情形呢,带着这个成绩,进进下一节的会商。
Android事务拦阻

从上一节剖析中,我们晓得了在Android中存在哪些事务范例,事务的传送历程和在源码中对应哪些处置办法。我们能够晓得在Android中,事务是经由过程层级传送的,一次事务传送对应一个完全的层级干系,比方上节平分析的ACTIONDOWN事务从Activity传送到RTButton,ACTIONUP事务也一样。分离源码剖析各个事务处置的办法,也能够明白看到事务的处置流程。
之条件过,一切事务处置办法的前往值都是boolean范例的,如今我们来修正这个前往值,起首从Activity入手下手,依据之前的日记输入了局,起首实行的是Activity的dispatchTouchEvent办法,如今将之前的前往值super.dispatchTouchEvent(event)修正为true,然后从头编译运转并点击按钮,看到以下的日记输入了局。

<br>
能够看到,事务实行到dispatchTouchEvent办法就没有再持续往下分发了,这也考证了之前的说法,前往true时,不再持续往下分发,从之前剖析过的Activity的dispatchTouchEvent源码中也可知,当前往true时,就没有往实行onTouchEvent办法了。
接着,将上述修正复原,让事务在Activity这持续往下分发,接着就分发到了RTButton,将RTButton的dispatchTouchEvent办法的前往值修正为true,从头编译运转并检察输入日记了局。

<br>
从了局能够看到,事务在RTButton的dispatchTouchEvent办法中就没有再持续往下分发了。接着将上述修正复原,将RTButton的onTouchEvent办法前往值修正为true,让其消耗事务,依据之前的剖析,onClick办法是在onTouchEvent办法中被挪用的,事务在这被消耗后将不会挪用onClick办法了,编译运转,失掉以下日记输入了局。

<br>
跟剖析了局一样,onClick办法并没有被实行,由于事务在RTButton的onTouchEvent办法中被消耗了。下图是全部事务传送的流程图。

<br>
到今朝为止,Android中的事务拦阻机制就剖析完了。但这里我们只会商了单结构布局下单控件的情形,假如是嵌套结构,那情形又是如何的呢?接上去我们就在嵌套结构的情形下对Android的事务传送机制举行进一步的探求和剖析。
Android嵌套结构事务传送

起首,新建一个类RTLayout承继于LinearLayout,一样重写dispatchTouchEvent和onTouchEvent办法,别的,还必要重写onInterceptTouchEvent办法,在文章开首先容过,这个办法只要在ViewGroup和其子类中才存在,感化是把持是不是必要拦阻事务。这里不要和dispatchTouchEvent弄搅浑了,后者是把持对事务的分发,而且后者要先实行。
那末,事务是先传送到View呢,仍是先传送到ViewGroup的?经由过程上面的剖析我们能够得出结论。起首,我们必要对工程代码举行一些修正。
RTLayout.java
  1. publicbooleandispatchTouchEvent(MotionEventevent)publicbooleanonTouchEvent(MotionEventevent)publicbooleanonInterceptTouchEvent(MotionEventevent)0
复制代码
同时,在结构文件中为RTButton增加一个父结构,指明为自界说的RTLayout,修正后的结构文件以下。
activity_main.xml
  1. publicbooleandispatchTouchEvent(MotionEventevent)publicbooleanonTouchEvent(MotionEventevent)publicbooleanonInterceptTouchEvent(MotionEventevent)1
复制代码
最初,我们在Activity中也为RTLayout设置onTouch和onClick事务,在MainActivity中增加以下代码。
MainActivity.java
  1. publicbooleandispatchTouchEvent(MotionEventevent)publicbooleanonTouchEvent(MotionEventevent)publicbooleanonInterceptTouchEvent(MotionEventevent)2
复制代码
代码修正终了后,编译运转工程,一样,点击按钮,检察日记输入了局以下:

<br>
从日记输入了局我们能够看到,嵌套了RTLayout今后,事务传送的按次酿成了Activity->RTLayout->RTButton,这也就回覆了后面提出的成绩,Android中事务传送是从ViewGroup传送到View的,而不是反过去传送的。
从输入了局第三行能够看到,实行了RTLayout的onInterceptTouchEvent办法,该办法的感化就是判别是不是必要拦阻事务,我们到ViewGroup的源码中看看该办法的完成。
ViewGroup.java
  1. publicbooleandispatchTouchEvent(MotionEventevent)publicbooleanonTouchEvent(MotionEventevent)publicbooleanonInterceptTouchEvent(MotionEventevent)3
复制代码
该办法的完成很复杂,只前往了一个false。那末这个办法是在哪被挪用的呢,经由过程日记输入剖析可知它是在RTLayout的dispatchTouchEvent实行后实行的,那我们就进到dispatchTouchEvent源码内里往看看。因为源码对照长,我将个中的关头部分截掏出来做注释申明。
ViewGroup.java
  1. publicbooleandispatchTouchEvent(MotionEventevent)publicbooleanonTouchEvent(MotionEventevent)publicbooleanonInterceptTouchEvent(MotionEventevent)4
复制代码
从这部分代码中能够看到onInterceptTouchEvent挪用后前往值被赋值给intercepted,该变量把持了事务是不是要向其子控件分发,以是它起到拦阻的感化,假如onInterceptTouchEvent前往false则不拦阻,假如前往true则拦阻以后事务。我们如今将RTLayout中的该办法前往值修正为true,偏重新编译运转,然后点击按钮,检察输入了局以下。

<br>
能够看到,我们明显点击的按钮,但输入了局显现RTLayout点击事务被实行了,再经由过程输入了局剖析,对照前次的输入了局,发明本次的输入了局完整没有RTButton的信息,没错,因为onInterceptTouchEvent办法我们前往了true,在这里就将事务拦阻了,以是他不会持续分发给RTButton了,反而交给本身的onTouchEvent办法实行了,天经地义,最初实行的就是RTLayout的点击事务了。
总结

以上我们对Android事务传送机制举行了剖析,时代分离体系源码对事务传送过程当中的处置情形举行了探求。经由过程单结构情形和嵌套结构情形下的事务传送和处置举行了剖析,现总结以下:

iOS5开始支持CoreImage了还没去看Mac上的CI是很强大的CFNetwork---从来没用过我一般都会用ASIHttpRequset封装好的高层网络库OBJC实现的CFNetwork好像是C实现CoreLocation---获取位置的库工具很少
深爱那片海 该用户已被删除
沙发
发表于 2015-1-20 10:36:21 | 只看该作者
然而,在vmware软件环境下,安装Mac OS X操作系统也是一件非常复杂的事情,而且还有可能花费了大量时间,最后却跑不起来。笔者也是经过了大量的实践,
飘飘悠悠 该用户已被删除
板凳
发表于 2015-1-29 06:46:26 | 只看该作者
首先是基础,在汉昌的课程非常全面。从object—c到最后的毕业项目,基本上方方面面都涉及到了,我是一名非计算机专业的学生,起初学习还有点吃力,因为基础知识薄弱。经常像听天书
老尸 该用户已被删除
地板
发表于 2015-1-29 12:12:40 | 只看该作者
每个行业都一样,想要一天学有所成是不可能的,一定要做好努力的准备,做ios不是简单的学会oc语言。不怕多走弯路,就怕不肯动手。
金色的骷髅 该用户已被删除
5#
发表于 2015-2-2 22:34:25 | 只看该作者
边吃零食边看Stanford的视频教程
若天明 该用户已被删除
6#
发表于 2015-2-8 17:04:37 | 只看该作者
好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。
再见西城 该用户已被删除
7#
发表于 2015-2-11 05:35:26 | 只看该作者
学习ios没什么捷径,关键在于多动手敲,曾看到前辈开玩笑说怎么快速学会某技术,答案是:“提高打字速度,快点写代码就能快点学会了”。
活着的死人 该用户已被删除
8#
发表于 2015-2-11 16:30:06 | 只看该作者
我也从简单的状态栏适配开始,先研究了下关于状态栏的适配,特总结如下,供广大网友一起讨论交流。
小女巫 该用户已被删除
9#
发表于 2015-2-27 18:20:39 | 只看该作者
要学会通过各种方法将面前的事情变成自己感兴趣的,那专研起来就不会是无聊和折磨了。
飘灵儿 该用户已被删除
10#
发表于 2015-3-9 10:54:32 | 只看该作者
好处就是运行速度会变快,ios6针对系统的优化进一步加强了,很多网友测试ios6,第一感觉就是速度快,而且ios69会有一些新功能,新浪微博,facetime支持3G网等等。。弊端就是,现在的ios6只能算是正式版本的第一个版本,bug很多,不少人刷完ios6都出现了很多毛病,开不开机,缺少图标等等。。最好现在不要升级,等官网放出下一个版本的时候,再选择升级。。。
精灵巫婆 该用户已被删除
11#
发表于 2015-3-23 03:34:21 | 只看该作者
从C语言入门,因为IOS开发用的是OC语言,是在C基础上的,不过也跟C不是很搭界,你可以直接学习OC语言也可以,
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-5-8 15:27

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表