黑马程序员_OC之核心语法

一、点语法 : (方法调用)

  ------ IOS培训、android培训、期待与您交流!-------


    1、点语法的本质还是方法调用。

    2、java中的点语法是访问成员变量,而OC中的点语法转为相应的set方法和get方法

    3、当使用点语法时,系统会自动展开对应的程序;
 
    4、点语法的应用实例:
 
        先来看一下刚刚学习时,我们经常见到的代码:
 
         类的声明:

         #import <Foundation/Foundation.h>

         @interface Person: NSObject {    

            int _age;

         }

          - (void)setAge:(int)age; 
 
          - (int)age;

         @end

         类的实现:
 
         #import "Person.h"

         @implementation Person

         - (void)setAge:(int)age {

          age = age;  

         }

         - (int)age {

          return age;
         }

         @end
 
         在Main函数中:

         #import <Foundation/Foundation.h>
         #import "Person.h"

         int main(int argc, const char * argv[])
         {
   
             Person *p= [Person new ];
        
             // 设置age的值
             [p setAge:10];
        
             // 取出age的值
             int age = [p age];
        
             NSLog(@"age is %i", age);
 
             return 0;
          }

        上述的程序代码会稍显麻烦,用点语法就可以很方便的实现方法的调用
代码如下:

         #import <Foundation/Foundation.h>
         #import "Person.h"

         int main(int argc, const char * argv[])
        {
   
            Person *p= [Person new];
        
            // 设置age的值
            cat.setAge=10;
        
            // 取出age的值
            int age = [cat.age];
        
            NSLog(@"age is %i", age);
           
            return 0;
         }

     5、总结:

        1>、OC点语法的本质是方法调用,不是直接访问成员变量。

        2>、比如:p.age = 10;就相当 [p setAge:10];而int a = p.age;相当于[p age];即其实OC是将 左边的转换为右边的
            p.setAge=10;        ------->        [p setAge:10];

             int age = [p.age];  ------->   int age = [p.age];

     6、注意self使用点语法的情况

        当self和 . 有时在一起使用时会遭成死循环。

        - (int)age

        {      
             return  self.age; 
         }  

        self.age展开就相当于[self age]

二、成员变量的作用域

    @public : 在任何地方都能直接访问对象的成员变量

    @private : 只能在当前类的对象方法中直接访问(@implementation中默认是@private)

    @protected : 可以在当前类及其子类的对象方法中可直接访问(@interface中默认的是@protected)

    @package : 介于@public和@protected之间,只要处在同一个框架中,就能直接访问对象的成员变量

    @interface和@implementation中不能声明同名的成员变量

    在类的声明中,属性是用变量来表示的。这种变量就称为实例变量(成员变量),是在类声明的内部但是在类的其他成员之外声明的。类的每个对象维护它自己的一份实例变量的副本。实例变量作用域只限于为该类定义的实例方法。

    局部变量也叫自动变量,它声明在函数内,作用范围也在函数内,不能同一源文件的其它函数使用,也不能其他文件中的函数使用,局部变量存储在栈中。无论局部变量显示初始化,或者未初始化,都只有当定义它们的程序快被调用时(及执行时),才分配空间,声明或定义时并不分配,局部变量不是可执行每模块的一部分!!除非显示地局部变量进行初始化,否则,它们的初始值是不确定的。

三、@property和@synthesize

    在Person.h文件中

    #import<Foundation/Foundation.h>

    @interface Person : NSObject
    {
        int _age;
     }

     - (void)setAge : (int)age;

     - (int)age;

     在Person.m文件中
   
     #import "Person.h"

     @implementation Person

     - (void)setAge : (int)age
     {
         _age = age;
      }

      - (int)age
      {
         return _age;
       }

      @end

     如果有很多成员变量,这样就会写很多set、get函数,很麻烦

     因此可以使用@property和@synthesize自动生成set、get方法,代替上述程序代码,如下程序代码:

    #import<Foundation/Foundation.h>

    @interface Person : NSObject
 
    {
        int _age;

        int _weight;

        NSString *_name;
     }
    
     @property int age;

     @property NSString *name ;
    
     在Person.m文件中
   
     #import "Person.h"

     @implementation Person

     @synthesize age = _age;

     @synthesize name =_name;      

      @end

      在main.h文件中

       #import<Foundation/Foundation.h>

       #import "Person.h"

       int main ( )

       {
           @autoreleasepool{

               Person *p = [Person new];

               [p setAge:10];
            }
            return 0;
        }

   总结:1>、@property可以自动生成某个成员变量的set和get方法的声明

         2>、@property生成set、get方法声明的过程

            @property int age;

            - (void)setAge:(int)age; - (int)age;
       
            @property int _age;

            - (void)set_age:(int)_age; - (int)_age; 
 
            属性名称不要写下划线。

         3>、@synthesize帮助我们自动生成age的set和get方法的实现,并且会访问成员变量_age

         4>、会访问成员变量_age,如果不存在,会自动生成@private类型的_age变量
      
         5>、如果对象属性的数据类型一样,用@property可以以此写多个属性
@property int age,weight;

         6>、 自从Xcode4.4后,@property包揽了@synthesize的功能,用@property可以同时生成set和get方法的声明和实现

四、id

    1.id是一个万能指针,能指向\操作任何OC对象,相当于NSObject*

    2.id类型的定义:

      typedef struct objc object{

          Class isa
      }*id;

    3.id的使用:

      id p = [Person new];//注意id后不加* 

    注:当调用一个不存在的方法时,编译会马上报错

五、构造方法

    在main.h文件中

       #import<Foundation/Foundation.h>

       #import "Person.h"

       int main ( )

       {
           @autoreleasepool{

               Person *p = [Person new];

               /*完整地创建一个可用的对象,new的过程完成下面两个步骤

                  1.分配存储空间 +alloc
 
                  2.初始化 -init  */

                //1.调用+alloc方法分配存储空间

                  Person *p1 = [Person alloc];

                //2.调用-init进行初始化

                Person *p2 = [p1 init];

 //上述两个代码也可以综合起来写成:Person *p = [[Person alloc] init];
              
            }
            return 0;
        }    
  
  总结: 1>、构造方法:用来初始化对象的方法,是个对象方法,

         2>、我们刚开始用[Person new]来创建对象,其实这中间完成了两个步骤:1.分配存储空间 +alloc  2.初始化 -init  */

         3>、调用+alloc方法分配存储空间:Person *p1= [Person alloc];

             调用-init进行初始化:Person *p2 = [p1 init];

         4>、上述两个代码也可以综合起来写成:

              Person *p = [[Person alloc] init];

         5>、初始化成员变量,可以重写init方法

             在Person.m文件中

             - (id)init

             {
                 //1.一定要调用回super的init方法,初始化父类中声明的一些成员变量和其它属性

                 self = [super init];//当前对象 self
                    
                 //如果对象初始化成功才有必要进行接下来的初始化

                 if(self != nil)

                 { //初始化成功 

                    _age = 10;
                  }
                  return self;//返回一个已经初始化完毕的对象
              }
  
           6>、重写构造方法的目的:为了让成员变量创建出来,就会有一些固定值

           7>重写构造方法的注意点:先调用父类的构造方法[super init];再进行子类内部成员变量的初始化

           8>、自定义构造方法:

               一定是对象方法,一定以-开头;

               返回值一般是id类型;

               方法名一般以init 开头

               - (void)initWithName:(NSString*)name
               {
                    if(self = [super init]) {
                    
                        _name = name;

                        //也可以写成_name=@"rose"

                    }
                    return self;
                } 

           


  ------ IOS培训、android培训、期待与您交流!-------

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值