iOS学习笔记

   

         以下是我自学iOS开发时做的笔记,主要是OC语言的语法部分,没有包含fundation框架,以我的亲身感受总结出iOS


初学者容易犯的错误及疑问的地方,对本文如果意见欢迎与我交流,谢谢


     1.创建一个类产生.h.m两个文件,.h中对用到的变量、方法作声明,.m文件中实现,导入时只导入.h文件,如果直接把方法写在.m文件中,未在.h文件中进行声  明,则是私有方法

     2.@interface类名NSObject @end,代表声明一个类,冒号表示继承,不可省,要使用OC中常用的类,那么#import<Foundation/foundation.h>Foundation框   架内有个foundation.h文件,其中包括NSObject

     3.-(int) getAge;声明函数,-代表动态方法,即有对象才调用的方法,声明静态方法前用+

     方法后有几个冒号就有几个参数,类型用括号括住

     4.实现方法时方法名后不带括号

     5.创建类的对象,先调用静态方法alloc分配内存:[类名alloc]Student*stu=[Student alloc]OC对象一定是指针

     6.开发中这样创建对象,Student*stu=[[Student alloc] init];构造方法init用于初始化,可自己编写

     7.调用对象方法,[对象名方法]

     8.自己写一个构造方法(动态的),方法名以init开头,自定义构造方法首先要调用父类构造方法原因很简单[superinit]

     9.%@占位符代表打印一个对象,打印对象会调用description方法

     10.所有的OC对象都要用指针来指向它,定义一个字符串,NSString*str=@itcast;

     11.成员变量前要加下划线,_age,_number默认的规则

     12.点语法的本质是调用set方法和get方法

     12.当编译器遇到@property时,会自动展开get方法和set方法的声明

     13.@synthesizeage,height,number,实现三个变量的方法

     14.给对象发送某条消息相当于调用该对象的该方法

     15.类名和*是离不开的,除非继承声明时

     16.如果自己手动实现了gettersetterxcode就不会自动生成@synthesize,也就不会自动生出下划线的变量

     17.类内部定义的变量默认作用域是protect的,只能在类内部和子类中访问,提供get方法和set方法供外部访问

     18.动态方法内部的self是指调用当前对象,静态方法内的self是指类名

     19..h文件中声明的方法是公共方法,不声明而直接写在.m文件中的方法是私有方法,只有.m文件中能使用该方法

     20.stu.age=100本质是调用了set方法,intage= stu.age本质调用了get方法

      21.Student*stu=[Student new]相当于Student*stu=[[Student alloc] init],但前者不能调用自己写的构造方法

      22..m文件中用了@synthesize,那么在.h文件中的成员变量定义可省略,因为该变量会在.m文件中自动生成,但是是私有的

  1. @synthesizeage;默认访问与age同名的变量,如果找不到则自动生成

  2. @synthesizeage = _age,代表gettersetter会去访问_age,如果没有_age也会自动生成。那为啥不直接@synthesize_age啊我去

  3. Xcode4.5之后的版本,如果在.h文件中使用@propertyage,则会在.m文件中自动生成@synthesize,即自动生成gettersetter,默认访问的是_age变量(也是自动生成)

  4. Xcode关闭arc在开发中的项目在项目设置的buildsetting中搜索garbage关键字就可以看到这个选项了,然后选择NO再次运行各种release就不会报警了

  5. 验证dealloc方法是否被使用时需要重写父类的dealloc方法,[superdealloc]

  6. OC注释:pragmamark,好处是可以快速定位注释位置

  7. 指向已经释放的内存的指针叫野指针,没有指向任何的东西指针叫空指针,OC中野指针会报错,空指针不会报错

  8. set方法的内存管理:只针对参数是对象的set方法,参数是变量的不涉及内存管理

  9. Studentset方法的参数是类Book的对象时,类Book产生了book对象后要自己释放掉,Student产生的对象stu第一次使用该book对象时要在set方法中对bookretain操作:_book=[book retain],在dealloc方法中对bookrelease操作:[_bookrelease],第二次使用book2对象要先在set方法中作release,赋值后再做retain,则可多次使用,该操作要先判断当前对象与参数是否相同,一般这样写:

  if(_book!=book){ [_bookrelease]; _book=[book retain];}

          这样写的原因再次看视频,语言不好表达

  1. retainCount方法获取对象当前计数器的值

  2. .h文件中声明对象时用到某个类,用@class关键字声明,在.m文件中实现时再用import导入,这样可提高编译性能

  3. 两个类互相拥有对方时,只能用@class而不能用import,原理是C语言两个文件中不能互相拥有

  4. property参数,retain,作用是实现方法时会release旧值,再retain新值

  5. property参数,默认是readwrite,代表既生出get方法又set方法,写readonly时只生出get方法

  6. property参数,默认是atomic,提供方法多线程调用,给get方法和set方法加锁,保证线程安全,nonatomic代表方法不需要考虑线程安全(禁止多线程调用,可提高性能)

  7. 语法:propertynonatomicretainBook*book;代表book的两个方法不加锁,且需要管理内存

  8. gettersetter也可作为property参数,getter= what ,代表getter的方法名是what

  9. [stuautorelease]不会改变对象的计数器值,只是将stu添加到自动释放池中

  10. 自动释放池被销毁时,里面的所有对象都会调用release方法计数器减一

  11. 常用写法Student*stu = [[[Student alloc] init] autorelease];

  12. 写一个静态方法快速创建对象,方法名最好与类名相同

  13. 系统自带的类如NSString,都是已经autorelease的,不需要再进行autorelease操作

  14. 静态方法创建的对象都是自动释放的,自己创建的静态方法(如快速创建对象)需要在方法实现中调用autorelease方法

  15. 静态方法不能访问对象的成员变量

  16. 垃圾回收机制:完全不用管理内存

         ARC:编译器自动生成管理内存的代码

  1. 不要把大量循环的代码放在同一个自动释放池中,浪费内存

  2. 尽量不要把占用内存大的对象放入自动释放池

  3. Category,可以在不改变已经存在的一个类的前提下为该类添加一个新的方法,相当于该类的拓展

  4. 类名后面有冒号代表继承,类名后面有括号代表分类,括号里是分类名称

  5. 分类只能扩展方法,不能增加成员变量

  6. Protocol相当于JAVA中的接口,但其中声明的方法可以不全部实现

  7. 类名(或协议)后面有<>代表实现某个协议,一般是NSObject

  8. 只有实现了某个协议的对象才能充当按钮的监听器

  9. Block:将一段代码封装到block中,可在任何时候调用这段代码

 

你可能感兴趣的:(ios,OC语法)