OC基础——核心语法



一、点语法
1、点语法本质还是方法调用,当使用点语法时,编译器会自动展开成相应的方法


1>如何判断set和get方法:
    如果是赋值,则是set方法。eg:stu.age = 10;
    否则是get方法:eg:int age = stu.age;
2> 一定要与访问成员变量区分开。访问成员变量:p->_age;

二、成员变量作用域

成员变量的常用作用域有3种:
1> @public 全局都可以访问,任何地方都可以直接访问。
2> @protected 只能在当前类和子类的实现@implemetation中直接访问。
3> @private 只能在当前类的实现@implemetation中直接访问。
4> @package:在同一框架中可以访问,介于@private和@public之间。
注意:
1> 写在方法申明中(即@interface中)的成员变量,如果什么都不写默认情况下为protected类型。
2> 写在方法实现中(即@implemetation中)的变量,默认情况下为私有的provite类型。此时哪怕是变量前面加上了@public也没用。如果将@implementation搬到了main函数前面,那么在@implementation中定义的成员变量前面加上@public就有效了,此时可以在任何地方访问。若放在main函数之后则出错。
3> OC里的继承只是单继承,只有一个类。
eg:

<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface Student : NSObject {
int age; // 年龄

@public
int no; // 学号
int score; // 成绩

@protected
float height; // 身高

@private
float weight; // 体重
}

- (void)setAge:(int)newAge; 

- (int)age;

@end
</span>

一共有5个成员变量,其中
@public作用域的有:no、score
@protected作用域的有:age、height,age虽然没写类型,但是默认情况下为@protected 类型
@private作用域的有:weight
一定要记住:一个冒号:对应一个参数,而且冒号:也是方法名的一部分。

三、@property和@synthesize

 1>@property: 可以自动生成某个成员变量的setter和getter的方法声明
    eg:@property int age;  // 会自动生成_age成员变量, int是get方法的返回值类型和set方法的形参类型。 age是set形参名和get的方法名
      自动生成 - (void)setAge:(int)age;
                     - (int)age;

 2>@synthesize :自动生成set方法和get方法的实现,并且会访问_age这个成员变量。
   eg:@synthesize age = _age;  代表形参age会访问_age这个成员变量,如果_age不存在(这里的不存在是指没有声明_age),则会自动生成一个@private的成员变量_age;
         @synthesize age;  代表在set和get方法的实现中会访问age成员变量,如果成员变量age不存在,则自动生成一个private类型的age成员变量。

3>注意点
    (1)方法调用时,会优先调用手工编写的方法,如果没找到再调用自动生成的方法。
    (2)@property会自动生成_成员变量名。
                eg: @property age; // 自动生成_age,类型是@private;
             @synthesize 会自动生成 成员变量名。
                eg: @synthesize age; // 自动生成age,类型是@private;

其实,@property既可以生成get和set方法的声明,也可以生成set和get方法的实现。
eg:
<span style="font-size:14px;">@interface Person:NSObject
@property int age;
@end

@implementation Person
@end</span>
解析:@property int age代码有如下三个作用:
                     1>生成成员变量_age
                     2>声明成员变量_age的setter和getter方法
                     3>实现成员变量_age的setter和getter方法

四、id
概念:万能指针,能指向或操作任何OC对象。(已经包含了* ,在调用时不需要加*)
相当于NSObject  *
   eg:   id d= [person new]; // 使用student类创建对象d
        或者 NSObject *d = [person new]; // 多态语法

五、构造方法(init
  定义:用来初始化对象的方法,是个对象方法。以“-”开头
  目的:为了让对象创建出来,成员变量就拥有固定值(每个对象内部的成员变量默认初始化全部为0
  注意点:(1)先调用父类的构造方法(eg:[super init])
               (2)再进行子类内部成员变量的初始化

 1、创建对象过程
      (1)分配存储空间:使用     +alloc 给对象分配空间 (返回一个分配了空间的对象,但是没有初始化)
            Person *p1 = [Person alloc];
      (2)初始化  使用  -init 初始化对象 
            Person *p2 = [p1 init];
      以上可以归纳为 Person *p3 = [[Person alloc] init];  
-(id)init //为什么使用id,因为id可以指向任何数据类型,而init可以被任何数据类型访问,其返还值不确定,故用id。
{
    if(self=[super init])//初始化子类的时候,一定要调用super的init方法,即初始化父类的成员变量和相关方法,返回已经初始化了的当前对象self,如果初始化成功,则继续操作。
   {
         _age = 10;
   }return self;//返回一个已经初始化了的对象
}
2、执行过程:

注:student初始化时调用person的init方法。person初始化时调用NSObject的init方法。
      赋值顺序:首先赋值ISA,然后再赋值_age,最后初始化_no(从父类开始赋值)
      初始化顺序:1>先初始化父类,然后再初始化子类。但是调用的时候先调用子类的方法,再调用父类方法。
                         2>先初始化自身的ISA,然后再初始化其它成员变量。

3、自定义构造方法
     规范:(1)一定是对象方法,一定以 - 开头
               (2)返回值一定是id类型
               (3)方法名一般是以init开头。
               (4) 成员变量数量:自有成员变量加父类成员变量。(NSObject默认有成员变量ISA)     
     原则:父类的成员变量父类处理,子类的成员变量子类处理。
 eg:
-(id)initWithAge:(int)age //设置初始化方法,方法名:initWIthAge:
{
   if(self=[super init])
  {
       _age = age;
  }
  return self;
}

int main()
{
    Person *p=[person alloc]initWithAge:20;//初始化之后age的默认值为20.
    return 0;
}
多参数:
- (id) initWithName:(NSString *)name andWithAge:(int)age
{
     if(self = [super init])
    {
      _name = name;
      _age = age;
    }
   return self;
}<strong>
</strong>

4、new方法和alloc、init方法区别
  new 是分两步来生成对象的
      1> 调用+alloc 方法来给对象分配内存空间
      2>调用-init 方法给对象的成员变量初始化成默认的值
缺点: 不能在创建对象的同时进行一些必要的初始化值

  alloc、init方法
优点: 可以在对象初始化时,使成员变量拥有必要的初始化值


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值