分享

继续扫盲

 许多润泽 2012-11-03


127.0.0.1 == localhost  表示本机的ip


http://127.0.0.1:8080/HttpServer/ 

8080 端口号

dns-域名解析器   将域名解析为 ip地址

http协议,http协议的端口号默是80


手机不同型号的的内存,分辨率。 


1,  类文件: 定义类的文件。 可以看看工程的源文件。


2,类:  对一种事物特性和行为的描述。比如人,创建一个对应的类,类的名字叫People,这个类里面可以包含了人的特性和行为。

              特性叫属性 行为叫方法。类总体上就包含这两样东西。

              类本身是为了创建对象而存在的。

              就好比车模是为了生产汽车而存在一样。车模是类,对象就是能跑的汽车。


              一个最简单的类是啥样子?  比较一下入口类。


3,对象: 用类创建了对象就是在内存里开辟一块空间,这个空间是独立于其他空间的对象的。 这个空间里有啥呢? 简单的说包含了属性和方法。


4,什么是入口类? 

       程序运行时首先会自动创建一个类的对象,这个类称之为入口类。 系统不但自动创建了入口类对象,还会根据情况自动使用(也叫调用)了入口类对象的方法。


5 入口类的方法是怎么自动调用的? 


6 一个类的属性和方法是如何声明和实现的?


7,声明一个Byte类型变量的含义? 就是在内存里开辟了一个字节的空间,来装数据。数据在计算机内部都是二进制形势来存放的。



8 声明多种类型的变量,体现基本类型(也叫简单类型)的含义。(各类型占用多少个字节的内存)

     重点:什么是指针,指针跟基本类型变量的区别: 指针是用来保存对象所对应的内存区域的地址的。


9,声明一个不带参数和带参数的方法,然后本地手工调用。

      重点:

     什么是方法? 以及方法的方法名参数类型参数别名”,  “ 返回值


     什么是方法的调用? 怎么传参?

      实例方法必须要通过对象调用,本地调用用self代表自身的对象。

      People *p= [ [People alloc] init]; //要明白p所指向的对象来自于init方法的返回值。


10,给people类定义跟人有关的属性和方法,体现类的封装和对象的使用


11 体现给对象的属性传值? 可以体现property属性描述的作用。给方法传值? 体现方法的多个参数的使用。 


12,创建男人类和女人类体现继承的关系。继承就是继承了父类的属性和方法。如同把

父类的属性和方法写在子类里一样。


13,创建同样的方法来覆盖父类,但保留父类的功能。


14,创建重载方法。 

        覆盖和重载体现了面向对象编程思想的多态性。多态, 就是多种形态的意思。


15,难点:体现方法的回调性。把本对象传递给另外一个对象的属性,达到通过这个对象来调用其自身的方法的目的。


16,  协议

===============================




0。ipad设备的大小是1024*768(去掉状态栏)。

1。按钮设置前景图时,按钮的大小与图片大小一致。

2。动画块执行的原理应该是一个分线程

3。在入口类里,让设备旋转的方法不会调用,    [[UIApplication sharedApplication] setStatusBarOrientation: UIDeviceOrientationLandscapeLeft];

只是让设备旋转,并不能让其内容旋转。所以在入口类里添加一个图片的话,他不会跟着设备旋转。


4。在入口类里让设备旋转后,还应该让每个试图控制器也旋转一下。保证加载每个视图控制器的视图都是与设备旋转的方向一致。

5。想让一个view放到视图的最上面一层,可以用[self.view bringSubviewToFront:(UIView *)view];

6。uiview上添加的多个视图都有一个索引,按照添加的顺序有一个索引(从0 开始)。视图上添加的视图其实是一个数组,

NSArray *viewarr=self.view.subviews;找到所有的子视图


for(UIView *vi in viewarr){遍历数组

if (vi==btn1) {判断指针是不是指向咱们要找的那个视图

int index=[viewarr indexOfObject:btn1];根据这个视图找到他在这个父视图上的索引

NSLog(@"%d",index);

UIButton *btnselect=(UIButton *)vi;

[btnselect setTitle:@"111" forState:UIControlStateNormal];

}

}

按钮上有图片时,要把图片的可交互性设为不可交互。

iPad的jian'ban键盘高度是350,动画时间0.3

父视图不可交互时,子视图也不可交互。

导航器只有压栈后才会传值。

继承父类时,xib文件里面的视图不会直接显示,要加载父类的xib文件(创建视图控制器的时候加载xib时绑定父类的xib),用代码写的可以直接继承。


用动画快的时候,要记着把动画块结束掉,否则后面的代码也会执行动画。






Objective-C基本语法?一  类的定义:Java中定义一个类的写法:

import  java.awt.*;

public class A extends Object implements UIApplicationDelegate{

   int   x=3; 

   String  str=”hello”;//创建字符串 

   public boolean  ok(){

         return  true;

    }

}



总结: 在Objective-C里, 在.h中声明的属性默认为私有,方法默认为公有.  无论属性还是方法, 在.h中仅仅是一个声明,具体的属性的赋值 和 方法的实现都在.m文件中进行。

二:

(1)方法的定义详述


比如ava或c#中,一个方法的写法可能是:

 void hello(bool ishello)

{

//OOXX

}

 

用objective-C写出来就是:  “-”  号表示实例方法,也就是用对象调用的方法。

-(void) hello:(BOOL)ishello

{

//OOXX

}

--------------------------------------------------------------------------------------

 static void hello(bool ishello)

{

//OOXX

}

 用objective-C写出来就是: “+” 号表示静态方法

+(void) hello:(BOOL)ishello

{

//OOXX

}

(2)方法的调用详述: 使用中括号

 

比如java或c#里你可以这么写:

 

this.hello(true);  // 对象调用方法

 

在Objective-C里,就要写成:

 

[self  hello:YES];

 

三、object-c 一个方法如何传递多个参数?

 如果你用java或者c#写这个方法,大致的写法可能是

public void setKids( String myName, String mySecondName, String myThirdName)

{

}

调用这个方法的时候大概的写法可能是:

Kids myKids = new Kids(); //创建对象

myKids.setKids (“张大力”, “张二力”, “张小力”);//对象调用方法


Object-c的方法:

一个参数的方法回顾:

 -(void) hello:(BOOL)ishello{


}

多个参数的方法:从第二个参数开始,每个参数要附加一个别名

-(void) setKids: (NSString *)myName   secondKid: (NSString *) mySecondName   thirdKid: (NSString *) myThirdName{

      //赋值给本地指针

  

self.myoldset = myName;

      //错误的赋值, 提示”隐藏实例变量“警告

//self. mySecondName = mySecondName;

}

   object-c  创建对象并调用方法的方式:

Kids  *myKids =[ [Kids alloc]  init] ;

      //object-c对象调用方法

[myKids setKids: @”张大力”   secondKid: @”张二力”   thirdKid: @”张小力”];

 

基本上,如果你能了解下面这段代码的转换关系,你Objective-C的语法也就懂了八成了:

 

[   [  [MyClass alloc]   init: [foo bar]   ]     autorelease];
 


转换成C#或者Java的语法也就是:


MyClass.alloc().init(foo.bar()).autorelease();

三、其他的一些东西

 NS命名由来

 

老乔当年被人挤兑出苹果,自立门户的时候做了个公司叫做NextStep,里面这一整套开发包很是让一些科学家们喜欢,而现在Mac OS用的就是NextStep这一套函数库,也叫cocoa。

 这些开发NextStep的人们把函数库里面的类都用NextStep的缩写打头命名,也就是NS****了。比较常见的比如:

NSLog

NSString

NSInteger

NSImage

 

举例说明:控制台输出内容

NSString *str1=@”xxx”;

NSString *str2=@”yyy”;

NSLog(@”%@”,str);   简写为NSLog(str);//xcode4.1会警告

两个字符串连接输出:

NSLog(@”%@,%@”, str,str2); 输出结果为xxx,yyy


int myInt=3; // Objec-c写法是 NSInteger myInt=3;

NSLog (@"----------------------%d",myInt);

float myFloat=3.1245;// Objec-c写法是 CGFloat myFloat=3.1245 ;

NSLog(@”%f”, myFloat);

 

你还可以看到其他名字打头的一些类,比如CF、CA、CG、UI等等.

比如

CFStringTokenizer 这是个分词的东东

CALayer 这表示Core Animation的层

CGPoint 这表示一个点

UIImage 这表示iPhone里面的图片

 

CF说的是Core Foundation,CA说的是Core Animation,CG说的是Core Graphics,UI说的是iPhone的User Interface……还有一些别的。

其实这些本站之前的文章有所提及,这里再详细解释一下。

 



1、 id是什么?:

 

Objective-C有一种比较特殊的数据类型是id。你可以把它理解为“任意类型”。

 

在Objective-C里,一切东西都是指针形式保存,你获取到的就是这个对象在内存的位置。那么id就是你知道这个位置

 

2、BOOL:YES,NO:

if(0)

你可以认为YES表示Java里的trueNO表示false。而实际上YES1NO0BOOL本身就是个char

 

3、nil。

Objective-C里的NULL(空)就这么写,表示空指针。


4,常用数据类型经常分为可变或不可变

    NSString  *S=@”111222”//不可变字符串

    NSMutableString// 可变字符串,相当于java里的StringBuffer字符串缓冲


    NSArray //不可变数组,初始化的时候就包含了一些对象(可以是不同类型)

    创建数组对象:NSArray *array=[[NSArray alloc] initWithObjects:@"hello",@"world",nil];

    NSMutableArray  //可变数组,可以动态增加内容,相当于java里的vector

    NSMutableArray  *muableArray=[ [NSMutableArray alloc] init];//创建对象

    [NSMutableArray addObject:@"good"];//添加内容


    NSDictionary   //字典

    NSMutableDictionary  //可变字典,相当于java里的hashtable


  5, 如果定义了一个变量或对象但是不使用就会有黄色的警告

    


什么是类;什么是对象,什么是封装,什么是多态,什么是继承;什么是接口?


简单来说,类就是对一个事物抽象出来的结果。比如人可以作为一个类。一般来说,一个类具有成员变量和成员方法。成员变量相当于属性,比如具有的变量有胳膊,手脚等。而成员方法是该类能完成的一些功能,比如可以说话(talk),行走(walk)等。


对象,如果说类是一个抽象概念,那么对象就是具体对象。比如我们说就是一个抽象概念,但是具体到某个人,比如你,我,他,就是一个对象。


封装,简单理解就是把一系列的数据放在一个类中,还用前面的例子,如果形容一个人,我们可以用身高(hight),体重(weight)等来描述。在面向对象中,可以用一个Person类封装这些数据,Person具有2 个成员变量,分别是height,weight。使用的时候,每当生成一个这样的类的对象,就具有这2个属性。


继承,如果B类继承A类。那么B类将具有A类的所有方法,同时还可以扩展自己独有的方法和属性。还用人做例子。是父类,那么男人女人都是继承自。也就是说,不论男人女人,都具有身高体重这两个属性,同时,他们可以有自己独有的属性,比如女人可以有一个三围属性-_-


多态,在java中,同一个方法可以有多种不同的表现形式,具体说来分为重载和重写。重载就是一个方法的方法名相同而所具有的参数列表不同。比如:

public String talk(String content);   //参数是String,

public String talk(String content, int number)  //参数是2个,Stringint


重写则是子类在继承父类的同时,重新实现了父类的某个方法。重写的方法名和参数都必须完全相同。

比如父类

public String talk(String content) {

     System.out.print(content);

}

子类继承该类,所以也具有talk这个方法,他重新定义了该方法的实现

public String talk(String content) {

   System.out.println("Hi" +content);

}


抽象类和一般类的最大区别,就是不能实例化一个对象,但是它可以被继承。


接口则是指定义了方法的名字,而不定义他的实现。方法的具体实现由其实现类去完成。比如

public interface mp3{

     public void play();

     public void pause();

}


这就定义了一个mp3的接口,任何其他类都可以实现这个类,但是实现这个接口就必须实现这个接口所定义的方法。换句话说,任何实现mp3的类,都必须具有play()pause()的方法,比如

public class IPod implements mp3{

     public void play(){

          //具体实现

     }

     public void pause(){

          //具体实现

     }

}




对象的大小是它的数据成员所占存储空间之和,就和结构体一样。类中的函数是所有该类对象通用的方法,不算作对象的成员,因此也不算在对象的存储空间内 






什么是堆和栈?

一个由c/C++编译的程序占用的内存分为以下几个部分

1、栈区(stack由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。

2、堆区(heap一般由程序员分配释放, 若程序员不释放,程序结束时可能由OS回收 。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表,呵呵。

3、全局区(静态区)(static,全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域, 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域。 - 程序结束后有系统释放

4、文字常量区常量字符串就是放在这里的。 程序结束后由系统释放

5、程序代码区存放函数体的二进制代码。





程序生成的过程,包括预编译,编译和链接

而函数包含进来,只是说明他需要编译通过,而没有调用的函数,是不会被连接到文件中的,所以不会占用很多资源的


main(int argc,char** argv)函数参数的具体含义

argc 是命令行参数的个数,包括该命令自身

argv 是该程序的命令行参数,每个是一个字符串,第一个就是该命令自身

如在命令行中运行:a.exe  b  c

那么argc=3

argv"a.exe","b","c" 

这里a.exe是该代码编译成的可执行文件


细节和架构一样重要!

两个字,干净,一定要苛刻的要求干净

你是否有时候自己的代码自己都不想看?你是否有过改过几次需求之后,你的工程已经完全负担不起下一次改动了?
你有没有见过几百甚至几千行的代码,你有没有看过一些代码,里面都是些a1,a2,a3这样的变量或者方法?你有没有和同事合作时,有些人的代码你喜欢看,有的人的代码你不敢看?你有没有遇到过有的同事如果离职,他的代码不会有人接手,只能废弃重来?

曾经我以为是架构的问题,是经验的问题,是技术水平的问题,我花了很多时间去学习框架,我觉得一个优美的框架可以解决一切问题,可惜最后发现,这远远不够。

把设计、架构这些暂且抛开,这里只说一个词,干净!

一定要拼了命的干净!

我是相当痛恨混乱无序的代码,教训太惨痛了。这里我想借用 《代码的整洁之道》 这本书里面名家说的话。

我喜欢优雅和高效的代码。代码逻辑应当直截了当,叫缺陷难以隐藏;尽量减少依赖关系,使之便于维护;依据某种分层战略完善错误处理代码;性能调至最优,省得引诱别人做没规矩的优化,搞出一堆混乱来。整洁的代码只做好一件事。
-Bjarne Stroustrup,C++语言发明者

 

整洁的代码简单直接。整洁的代码如同优美的散文。整洁的代码从不隐藏设计者的意图,充满了干净利落的抽象和直截了当的控制语句。
-Grady Booch,Object Oriented Analysis and Design with Applications(中译版《面向对象分析与设计》)一书作者。

我无意 做概念上的抄袭,只是今年在做去年开发的总结的时候,对代码加入了一些自己的要求,这个要求对交给我现在的同事和以后组里新来的人手里,作为项目组开发的 基本规范执行。然后这个时候接触了《代码的整洁之道》这本书,有点醍醐灌顶的感觉。那些基本要求做了修改,现在是这个样子,大家可以看一下,这个是我纯主 观的想法,如果有不同的意见欢迎讨论。

1,命名,命名就是注释。
用驼峰法,比如 doSomething
类名:头字母大写
方法名:头字母小写
局部的子方法里允许 int i这种,但是常用的方法中,必须写成 int xxxIndex
临时变量命名        tmpXXX

然后,如果发现命名不对,或者后来发觉其他命名方式更好,用项目的命名修改工具修改

2,方法(函数)
方法名一定要能做注释,如果必要,加方法注释,如果IDE允许,一定是那种别人在引用你的方法的时候了可以直接看到的注释(这里解释一下,记得java中 可以通过在函数前面加/**xxx*/加注释,这样当方法提示的时候,会自带这种注释提示,xcode,mono都有类型的功能)
一个方法只做一件事,尽可能这样,如果一个方法做了n多事,拆分。
一个方法不允许出现大于100行的情况,正常50行以内(这个要求已经很宽泛了),如果大于100,拆分,没有时间,自己找时间拆分
方法内,相关的代码写在一起,不要有空行,相关度小的,留一个空行
良好的缩进,这里不做强制要求,采用两种缩进中的一种,根据个人习惯
能私有的方法一定要私有,不要让大家看到(OC是通过类别来实现的)
多用代码组的工具,并加入清晰的注释
(Xcode中,是通过 #define mark xxx注释 来让方法分组的)
(Unity3d中的mono工具是 #region xxx注释 #endregion)

3注释
如果命名能做注释,就不要注释
如果不得不做注释,尽量是那种别人调用的时候可以直接看到的注释
类的每一个和其他类有关联的成员,都写上注释
如果一个注释已经过时了,删掉或修改掉

//以上1,2,3 针对团队所有人

4,关于框架
每一个类尽量只做一件事或一类事
少用继承,多用组合
类内高内聚,类之间低耦合
UI和数据分开,如果有足够的时间

5,重构
唯一不变的就是变化,游戏开发尤其如此,适当的时候,提出重构
频繁,多次,自己抽时间做重构

6,关于合作
对每一个人做的东西,让他有一个系统的概念,不要今天做这一块,明天做那一块
合作尤其要求代码的可读性,一定要让自己的代码别人可读
如果你是一个程序员,做好自己的代码,如果你负责很多人,让每一个人写好自己的代码,然后,你写好清晰的接口
和策划谈需求时尽量搞清楚,开始做的时候去白班上画图,让开发者都清晰的知道设计思路和每个人做什么
诱导为主,拒绝依赖性的问问题,这个态度一开始就要让问问题的人知道

7,关于warning

xcode里面开发程序的时候,自己写的代码,0 warning,第三方的,warning处理到 个位数,或者全部处理掉
很多时候,需求的变动和时间的压力会让一个开始很干净的工程慢慢变得一塌糊涂,没有捷径,除了细节上的注意,就是一遍又一遍的重构。个人认为项目中绝大多 数时间是在维护代码,而不是写新代码,既然要维护,能够一眼看清的代码是最好的,而团队合作又会把代码的可读性问题无限制的放大,尤其是遇到一些很聪明常 常自作主见和一些偷懒的人的时候。基本的规范是一定要遵守的,而这个习惯也会有助于程序员越走越远。每一次重构都是一次脱胎换骨的涅槃,其中的痛,只有身 在其中的人知道,很多时候都是自己在下班时间做的。


补充一点,咆哮同学说,这整个说的都是微操,至于架构,那是大局观的问题,打dota或者魔兽对战或者星际的同学们一定懂的。大局观神马的,我还差蛮多呢




  


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多