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; }
相关文章推荐
- 小画板demo
- iOS开发-系统自带的正则表达式
- iOS 如何自定义NavigationBar的高度
- iOS利用drawRect画图
- iOS开发:Xcode项目添加资源文件注意点
- iOS 页面间几种传值方式(属性,代理,block,单例,通知)
- IOS学习之websocket使用方法
- IOS开发之录音
- iOS个人整理31-MD5,base64编码,KeyChain加密
- iOS开发调试技巧总结
- IOS开发之音效/音频播放
- iOS中使用工厂模式定制cell
- iOS中单例的通用写法
- iOS开发模式之单例模式
- iOS的系统框架
- iOS常用的开发模式总结
- iOS中3种正则表达式的使用与比较[转]
- iOS开发过程中触摸事件的处理(hitTest的使用)
- IOS中NSLog输出的格式化占位
- IOS汉字转拼音