您的位置:首页 > 移动开发 > IOS开发

iOS之08-核心语法

2016-03-22 21:57 513 查看

1、点语法

 点语法( . )的本质还是方法调用, java中的点是访问成员变量, 在OC中直接访问成员变量的方式只有 ->

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

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


 点语法造成的死循环

// age的setter和getter方法
- (void)setAge:(int)age {

// 会引发死循环
//    self.age = age; // [self setAge:age]
}
- (int)age {

// 会引发死循环
//    return self.age; // [self age]
}


实例代码:

Person.h:

#import <Foundation/Foundation.h>

@interface Person : NSObject
{
int _age;
}

// age的setter和getter方法
- (void)setAge:(int)age;
- (int)age;

@end


person.m:

#import "Person.h"

@implementation Person

// age的setter和getter方法
- (void)setAge:(int)age {
_age = age;
NSLog(@"setAge");

// 会引发死循环
//    self.age = age; // [self setAge:age]
}
- (int)age {
NSLog(@"age");
return _age;
// 会引发死循环
//    return self.age; // [self age]
}
@end


main.m:

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

int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *p = [Person new];

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

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

NSLog(@"%d", a);
}
return 0;
}


2、@property和@synthesize

 1> @property

  ① 用在@interface中

  ② 用来自动生成setter和getter的声明

  ③ 用@property int age; 就可以代替下面的两行

- (int)age;  // getter

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


 2> @synthesize

  ① 用在@implementation中

  ② 用在自动生成setter和getter的实现

  ③ 用@synthesize age = _age; 就可以代替下面的代码

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


 3> @synthesize 的细节

  ① @synthesize age = _age;

   setter 和 getter 实现中会访问成员变量 _age

   如果成员变量 _age 不存在,就会自动生成一个 @private 的成员变量 _age

  ② @synthesize age;

   setter 和 getter 实现中会访问成员变量 age

   如果成员变量 age 不存在,就会自动生成一个 @private 的成员变量 age

  ③ 手动实现

   若手动实现了 setter 方法,编译器就只会自动生成 getter 方法

   若手动实现了 getter 方法,编译器就只会自动生成 setter 方法

   若手动实现了 setter 和 getter 方法,编译器就不会自动生成不存在的成员变量

  ④ @property 新特性

   自从Xcode4.5后,@property 就独揽了 @synthesize 的功能。也就是说, @property 可以同时生成 setter 和 getter 的声明和实现

   默认情况下,setter 和 getter 方法中的实现,会去访问下划线 _ 开头的成员变量

如果存在setter或getter方法,点语法使用时系统就会优先选择存在的方法

3、id

 1> 简介

万能指针,能指向操作任何OC对象,id == NSOBject *

id 类型的定义

  typedef struct objc_object {

    Class isa;

  } *id;

 2> 使用

  注意:id 后面不要加 *

  id p = [Person new];

 3> 局限性

  调用一个不存在的方法,编译器会报错

4、构造方法

 1> 完整的创建一个可用的对象 

分配存储空间 +alloc

初始化 -init

 2> 构造方法

  用来初始化对象的方法,是个对象方法,"-" 开头。

  目的:为了让对象创建出来,成员变量就会有一定的固定值。

 3> 重写构造方法的注意点 

先调用父类的构造方法([super init])

再进行子类内部成员变量的初始化

 4> 实现代码

// 重写init方法
- (instancetype)init {
// 1.一定要调用回super的init方法:初始化父类中声明的一些成员变量和其他属性
//    self = [super init]; // 当前对象 self

// 2.如果对象初始化成功,才有必要进行接下来的初始化
if (self = [super init]) {
// 初始化成功
_age = 10;
}

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


 5> 自定义构造方法规范

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

返回值一般是instancetype类型

方法名一般以init开头

代码实现

// 自定义多参初始化方法
- (instancetype)initWithName:(NSString *)name
age:(int)age {
if (self = [super init]) {
_name = name;
_age = age;
}
return self;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: