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

黑马程序员-------OC中的一些核心语法

2015-10-09 10:54 253 查看
——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-

一、编译器特性:点语法

点语法是OC为帮助其他语言程序员迅速掌握和适应OC来创造的语法,点语法的本质为set和get方法的调用,例如:

`int main(int argc, const char * argv[]) {
Person *p = [Person new];
//点语法:此处点相当于调用set方法,将值set进成员变量
p.age = 10;
//点语法:此处相当于调用get方法,将值取出
int a = p.age;
return 0;
}`


注意:即使有了点语法,set和get方法必须要有才能正确编译和执行,因为点语法的本质是set和get方法。

二、成员变量的作用域:

1> @public:在任何地方都能直接访问的成员变量;

2> @private:只能在当前类的对象方法中直接访问的成员变量;

3> @protected:能在当前类和其子类的对象方法中直接访问的成员变量;

当什么都不写的时候,默认成员变量是protected。

三、编译器特性:@property和@synthesize:

1> @property:自动生成某个成员变量的set和get方法声明,如:@property int age;自动生成_age变量的set和get方法声明。

2> @synthesize:自动生成某个成员变量的set和get方法实现,如:@synthesize age = _age;自动生成_age变量的set和get方法实现。

注意点:

1> 上述@synthesize语句会访问_age这个成员变量,如果不存在,就会自动生成这个成员变量;

2> Xcode4.4版本以后,@property可以自动生成成员变量的set和get方法声明、成员变量的set和get方法实现并且自动声明带有下划线的成员变量,但是成员变量的作用域为private;

3> @synthesize age = _age语句如果不写=后面的部分,会默认访问age变量而不是_age;

4> 只会在没有set或get方法的时候生成,如果代码中定义了set或者get方法,则只会生成缺少的那个方法,如果两个方法都有了,则什么都不会生成,包括成员变量;

四、id

id是一种变量类型,即id为关键字之一,id是万能指针,可以指向/操作任何OC对象,相当于NSObject *。

五、构造方法

构造方法init是用来初始化对象时调用的方法,是对象方法,重写构造方法的注意点有:

1> 一定要调用父类(super)的init方法,用以初始化在父类中定义的成员变量和其他属性;

重写init方法实例:

//重写init方法,构造方法
- (id)init
{
if(self = [super init])
{
_age = 10;
_no = 1;
}

return self;
}


调用构造方法实例:

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

int main(int argc, const char * argv[]) {

Person *p = [[Person alloc] init];//使用构造方法创建类的对象
NSLog(@"age = %d,no = %d", p.age, p.no);
return 0;
}


2> 自定义构造方法,规范有:

①一定是对象方法;

②返回值一般是id类型;

③方法名一般以init开头;

//自定义构造方法
- (id)initWithAge: (int)age andNo: (int)no
{
if(self = [super init])
{
_age = age;
_no = no;
}
return self;
}


六、分类语法,category

分类为OC中特有的语法,可以给某一个类扩充一些方法,并且不改变原来类的代码。使用注意:

1> 分类只能增加方法,不能增加成员变量;

2> 分类中方法实现可以访问原来类中声明的成员变量;

3> 分类可以重新实现原来类中的方法,但是会重新覆盖掉原来的方法,导致原来的方法永远无法访问到,所以不建议这么做;

4> 方法调用的优先级:分类中的方法(最后编译的分类要高于前面编译的分类)–>类中的方法–>父类中的方法;

分类的写法参照下述小例子:

//分类的声明
#import "Person.h"

@interface Person (sdz)

- (void)study;

@end


//分类的实现
#import "Person+sdz.h"

@implementation Person (sdz)

-(void)study
{
NSLog(@"-----------");
}

@end


七、类的本质

1> 类本身也是一种对象,是Class类型的对象,简称类对象。

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

int main(int argc, const char * argv[]) {

Person *p1 = [[Person alloc] init];
Person *p2 = [[Person alloc] init];
Person *p3 = [[Person alloc] init];
//获取内存中的类对象(第一种方式)
Class c1 = [p1 class];
Class c2 = [p2 class];
Class c3 = [p3 class];
//获取内存中的类对象(第二种方式)
Class c4 = [Person class];
//c1\c2\c3\c4都指向内存中person类对象,地址相同
NSLog(@"%p, %p, %p, %p", c1 ,c2, c3, c4);

//拿到类对象后(即c1、c2、c3、c4)可以调用类方法
[c1 test];

return 0;
}


2> 当程序启动时,会将程序中所有的类都加载一次,类加载完毕后就会调用一次+ (void)load方法,先加载父类,再加载子类;

3> 当程序第一次使用这个类的时候,就会调用一次+ (void)initialize方法;

——Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——-
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: