老师分步讲了两天后发布一个爆炸性消息,前几天讲的基本上不会再用,只是对概念有一个了解..........so,零散的不做整理,直接上完整版
注: 初学者,若有理解不当之处,还请多指教
一 : 完整的自定义初始化方法
1 声明
- (id)initWithName:(NSString *)name
Age:(NSInteger)age;
// With 中的W一定要大写
2 实现
- (id)initWithName:(NSString *)name
Age:(NSInteger)age{
self = [super init];
if(self){
_name = name;
_age = age;
}
return self;
}
二 : 便利构造器
1 . 声明 // 注意前面使用+号 , 以类名开头,必须小写,With中W大写
+ (id)studentWithName:(NSStrint *)name
Age:(NSInteger )age;
2 . 实现
+ (id)studentWithName:(NSStrint *)name
Age:(NSInteger )age{
Student *stu = [[Student alloc] initWithName:name Age:age ];
return stu;
}
3 . 主函数调用
Student *stu = [Student studentWithName:@"张三" , Age:23];
NSLog(@"%@,%ld",stu.name,stu.age);
三 : 赋值取值
1 . 设置器赋值取值
赋值 : [student setName:@"李四"];
取值: NSLog(@"%@",[student name]);
2 . 点语法赋值取值
赋值 : student.name = @"王五";
取值 : NSLog(@"%@",student.name);
四 : 属性
1 . 属性的标志 : @property
2 . 属性的作用 :
(1) 定义了一个成员变量,成员变量的命名是: _ + 属性名
(2) 声明了setter 和 getter 方法
(3) 实现了setter 和 getter 方法
3 . 属性的属性 :
(1) 读写性设置: 就是对设置器和访问器进行控制,默认是可读可写 : readwrite
readonly : 只读,被它修饰的属性只有getter方法,没有setter方法
1). @property( readonly , getter = arr)NSString *str; // getter = method 相当于给getter方法重新命名
2). @property( setter = lin : )NSString *str1; // 当设置 setter 的时候,别忘了新的名字后加上冒号 :
(2) 原子性设置:
nonatomic , atomic
默认是 atomic 可以保证在多线程的情况下,访问数据,安全性.但我们一般只是普通的赋值,打开线程锁反而浪费资源,所以一般选择使用nonatomic.
@property( nonatomic )NSString *hobby;
(3) . 语义设置:
1). assign : 一般基本数据类型使用assign, 比如NSInteger,CGFloat等,这部分内容不需要管理内存
2). retain :一般的对象类型,比如我们自己定义的类,系统提供的数组等对象,都需要通过retain进行修饰
3).copy : 目前只有NSString使用copy
@property(nonatomic,copy)NSString *color;
@property(nonatomic,retain)Student *stu;
@property(nonatomic,assign)NSInteger age;
五 : 一个完整的方法定义实现和调用 // 以 Phone 为例
1 . 声明(.h文件下)
// 定义成员变量
@property(nonatomic,copy)NSString *brand;
@property(nonatomic,assign)NSInteger price;
@property(nonatomic,assign)CGFloat screen;
// 自定义初始化
- (id)initWithBrand:(NSString *)brand
Price :(NSInteger)price
Screen:(CGFloat)screen;
// 便利构造器
+ (id)initWithBrand:(NSString *)brand
Price :(NSInteger)price
Screen:(CGFloat)screen;
2 . 实现
// 自定义初始化
- (id)initWithBrand:(NSString *)brand
Price :(NSInteger)price
Screen:(CGFloat)screen{
self = [ super self ];
if ( self ){
_brand = brand;
_price = price;
_screen = screen;
}
return self;
}
// 便利构造器
+ (id)initWithBrand:(NSString *)brand
Price :(NSInteger)price
Screen:(CGFloat)screen{
Phone *phone = [ [ Phone alloc ] initWithBrand :brand Price: price Screen:screen ];
return phone;
}
3 . 主函数实现
Phone *phone = [ Phone phoneWithBrand:@"三星" Price:4200 Screen:5.7];
NSLog(@"%@,%ld,%g",phone.brand,phone.price,phone.screen);
// setter赋值取值
[phone setBrand:@"苹果"];
NSLog(@"%@",[phone brand]);
// 点语法 赋值取值
phone.price = 4300;
NSLog(@"%ld",phone.price);