您的位置:首页 > 职场人生

黑马程序员——OC---OC特有语法01

2014-11-25 18:44 267 查看
------<a href="http://www.itheima.com" target="blank">Java培训、Android培训、iOS培训、.Net培训</a>、期待与您交流! -------

一 点语法

OC设计点语法的目的,是为了让其他语言的开发者可以很快的上手OC语言开发,使用点语法,让它和其他面向对象的语言如java很像。其调用方法如下:

Person *p = [Person new];

p.age = 10; // [p setAge:10];

int a = p.age; // [p age];

p.name = @"Jack";

NSString *s = p.name;

NSLog(@"%@", s);

其实说到点语法的本质就是方法的调用,而不是访问成员变量,当使用点语法时,编译器会自动展开成相应的方法。切记点语法的本质是转换成相应的set和get方法,如果没有set和get方法,则不能使用点语法。如:

Stu.age=10;展开为:[stu setAge:10];

int a=stu.age;展开为:[stu age];

编译器如何知道是set方法还是get方法?主要是看赋值。在OC中访问成员变量只有一种方式即使用-> 如stu->age,这种情况要求在@public的前提下。

另外,使用点语法时,应该注意,以下两种会出现出现的情况:、

(1)在set方法中,self.age=age;相当于是[self setAge:age];

(2)在get方法中,return self.age;相当于是[self age];

二 成员变量的作用域

局部变量、全局变量都有自己的作用域,成员变量也不例外,也有自己的作用域。变量的作用域主要分为四种:

(1)@public (公开的)在有对象的前提下,任何地方都可以直接访问。

(2)@protected (受保护的)只能在当前类和子类的对象方法中访问

(3)@private (私有的)只能在当前类的对象方法中才能直接访问

(4)@package (框架级别的)作用域介于私有和公开之间,只要处于同一个框架中就可以直接通过变量名访问
三 @property和@synthesize

@property用在@inteface中可以自动生成某个成员变量的setter和getter声明。例如用@property int age;就可以代替下面的两行:

- (int) age; //geter

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

类似地,@synthesize用在@implementation中,用来自动生成setter和getter的实现,例如,@synthesize age = _age。注意,如果成员变量_age不存在,就会自动生成一个@private的成员变量_age。从新版本开始(4.2吧好像是),@synthesize已经不用了,因为@property已经可以自动生成声明和实现。


id类型

id在OC中是一个万能指针,可以指向任何的OC对象,相当于NSObject
*,其定义如下。要注意,使用时,id后面不要加上*,例如id p = [Person new]。其局限性体现在,当调用一个不存在的方法时,编译器会马上报错。

typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;

构造方法

对象的创建可以分为两步走:其中init方法就是构造方法,是用来初始化对象的方法,注意这是一个对象方法,一减号开头。默认初始化完毕后,所有成员变量的值都为0。

1>+
alloc 方法 分配存储空间

2>- init 方法初始化
我们在实际开发过程中经常需要对构造方法进行重写,重写构造方法的目的:为了让对象创建出来,成员变量就会有一些固定的值。在重写构造方法的
过程中应该注意,先调用父类的构造方法([super init]),再进行子类内部成员变量的初始化,重写构造方法的规范:例如代码如下:

(1)一定是对象方法,以减号开头

(2)返回值一般是id类型

(3)方法名一般以initWith开头

@implementation Person

// 重写-init方法
//- (id)init
//{
//    // 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
//    self = [super init]; // 当前对象 self
//
//
//    // 2.如果对象初始化成功,才有必要进行接下来的初始化
//    if (self != nil)
//    { // 初始化成功
//        _age = 10;
//    }
//
//    // 3.返回一个已经初始化完毕的对象
//    return self;
//}

- (id)init
{
if ( self = [super init] )
{ // 初始化成功
_age = 10;
}

// 3.返回一个已经初始化完毕的对象
return self;
}

@end
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: