OC-0724学习总结

来源:互联网 发布:银河铁道之夜 知乎 编辑:程序博客网 时间:2024/06/14 02:01
day:20130722
     1. 如果一个类中 有private,protected,public变量,类的对象只能调用public类型的变量。
     2. +表示类方法。用于对象创建之前就可以使用的消息。
        -表示对象方法。对象创建之后才能使用。


day:20130723
    1.类的私有方法写在.m文件中,声明格式@interface 类名 (Private)
                                   函数体
         @end
              定义格式@implementation 类名 (Private)
                                   函数定义
  @end


day:0724
    1.程序运行的过程
    2.总结clang指令
      编译   cc -c xxx.c
      链接    cc xxx.o
      编译、连接  cc  xxx.c
      运行当前路径下的可执行文件 ./out
      更改可执行文件的名称 cc xxx.c -o xxxxxx


   3.在任何情况下,在方括号中代码都意味着你是在给一个对象或者一个类型发送一个消息(即一个方法调用)。
     点语法只能使用在设置器(setter)和获取器(getter)上,而不能用于普通方法。


   4.创建对象2个主要方法:
     4.1 NSString *myString = [NSString string];//创建了一个自动释放的对象
     4.2 NSString * myString = [[NSString alloc]init];
        //alloc作用是分配内存及实例化一个对象。init做对象的初始化设置工作,比如创建实例变量。
        (注:在某些情况下,可以使用init方法的另外一种版本,这些版本带有输入参数:
         NSNumber *value = [[NSNumber alloc] initWithFloat :1.0];


   5.设计类
    每一个设置器都要处理两个变量,第一个是当前引用的对象,第二个是新输入的对象。在带有垃圾回收机制的环境中,我们可以直接设置成新的值。但是如果不能使用垃圾回收,需要release旧的对象,并且retain新的对象。
    释放一个对象的引用实际上有两种方法:release和autorelease。标准的release会立刻释放对象的引用。autorelease会等一会才释放,但是引用实际上会一直存在,直到当前方法结束(除非你添加自定义的代码来明确的改变它)。在设置器里面使用autorelease方法会更加安全一些,因为要改变的变量的新旧两个值可能指向的是同一个对象。而你可能不希望立刻释放实际上你要保留的对象。


   6.init
     我们可以创建一个init方法用来给我们的实例变量设置初始化值:
     - (id) init
     {
         if(self = [super init])
         {
[self setCaption:@"Default Caption"];
                [self setPhotographer:@"Default Photographer"];
         }
         return self;
     }
     这实际上是要求父类做(父类的)初始化操作。if语句的作用是尝试设置(本对象的)缺省值之前验证父类是否初始化成功。


   7.Dealloc
     dealloc方法在一个对象从内存中删除时被调用。通常在这个方法里面释放所有对象里的实例变量。
     -(void) dealloc
    {
        [caption release];
        [photogrpher release];
        [super dealloc];
    }
     前面两行直接调用了实例变量的release方法。这里我们不需要autorelease,因为标准release更快一些。
     最后一行非常重要,发送了一个[super dealloc]消息,要求父类做清理工作。如果我们不做的话,该对象就不会从内存中删除,这就造成了内存泄露。当启用垃圾回收机制时,对象的dealloc方法不会被调用。此时,可以实现一个finalize方法来代替它。


   8.内存管理
     在实际应用中,通常只有两个原因我们才会创建一个对象:
     1.作为一个实例变量保留。
     2.在函数内部作为临时变量使用。
     大多数情况下,一个实例变量的设置器setter会自动释放autorelease原来引用的对象,同时保留retain新的。你只需要保证在dealloc函数中释放release了它就行了。
     那么,我们实际要做的工作就只有管理函数内部的本地引用了。在这里只有一条规则:如果你通过alloc或者cpoy创建了一个对象,在函数结尾的地方给它发送一个release或者autorelease消息就行了。如果是通过其它方式创建的对象,就什么也别做。
     下面是第一个例子,管理实例变量:
      -(void) setTotalAmount:(NSNumber *)input
     {
         [totalAmount autorelease];
         totalAmount = [input retain];
      }
      -(void) dealloc
     {
[totalAmount release];
        [super dealloc];
     }


     下面是另一个例子,关于本地引用,我们只需要释放通过alloc创建的对象就行了:
      NSNumber *value1 = [[NSNumber alloc]initWithFolat:8.75];
      NSNumber *value2 = [NSNumber numberWithFolat:14.78];


      //only release value1,not value2
      [value1 release];


      下面是一个组合例子,将一个本地引用设置给实例变量:
      NSNumber* value1 = [[NSNumber alloc] initWithFloat:8.75];
      [self setTotal:value1];
     
      NSNumber* value2 = [NSNumber numberWithFloat:14.78];
      [self setTotal:value2];


      [value1 release];
      注意,不论你是不是把本地引用当成实例变量一样赋值,管理他们都是完全相同的。你不必考虑设置器setter是如何实现的。
      内存管理原则:
      1.谁创建谁释放。如果是通过alloc、new或(mutable)copy来创建一个对象,那么你必须调用release或autorelease。换句换说,不是你创建的,就不用你释放。
      2.一般来说,除了alloc、new或copy之外的方法创建的对象都被声明了autorelease。
      3.谁retain谁release。只要你调用了retain,无论这个对象是如何生成的,你都要调用release。
     
      9.在Nil上调用方法
      在Objective-C中,nil对象的作用等同于很多其它语言的NULL指针。不同的地方在于,在nil上调用方法不会导致程序崩溃或抛出异常。
     这种技术被用在很多地方,但是对于我们来讲,最主要的就是我们不用再调用一个对象的方法之前检查该对象是否为空。如果你调用了一个nil对象的方法并且该方法有返回值的话,你会得到一个nil返回值。
     我们可以用它稍微改进一下我们的dealloc方法:
     -(void) dealloc  
    {
        self.caption = nil;
        self.photographer = nil;
        [super dealloc]; 
    }
    可以这样做是因为当我们将nil赋值给一个实例变量,设置器setter会释放旧对象并且保存(retain)nil对象。这种做法对于dealloc来说更好一些,因为这样做避免了让变量指向一个随机的数据,而这个数据又恰好是另外一个对象。
   注意,我们这里使用了self.<var>语法,这表示我们使用的是setter,它会进行内存管理。如果我们仅仅是直接设置值,像下面这样,就会产生内存泄露:
   caption = nil;


     10.
变量的作用域:从定义变量的那一行代码开始,一直到所在的代码块结束
代码块的作用:及时回收不再使用的变量,为了提升性能
      int main()
      {
             {
              double height = 1.55;
                height = height + 1;

                printf("height = %f\n",height);

}

         }

      //执行下面程序时,height已经回收

       int a = 1;

       int b = 2;

       int c = a + b;

       return c;

      }
原创粉丝点击