本节主要学习了用property声明变量的set get方法,效率正常。
小结:
技术瞬息万变,要学会推翻和改变之前的看法。
注:.h文件声明的时成员变量和方法。 (自己的错误读法:声明类和方法)
知识点一:property
关于@property的属性变量,有以下三个功能:
1、声明了setter方法 2、声明了getter方法 3、声明了一个变量,变量本身的名字是__name
举例:
在.h文件中完成对set和get方法的声明 @property (nonatomic,strong) NSString *name;
在.m文件中完成对set和get方法的实现 @synthesize name=_name // 随着更新 property已自动完成实现 此句可省略
@property 大大简化了步骤
@property (nonatomic,strong) NSString *name;
等同于
-(void)setName:(NSString *)name;
-(NSString *)name;
总之,一句property代替了set、get方法的声明,声明了一个变量,也不用实现了。
知识点二:property的关键词理解
nonatomic:非原子操作 线程不安全 (无锁机制)效率高 (一般都写这个)
atomic:原子操作 线程安全(有锁机制) 效率低(默认)
OC对象类型都为strong/retain
strong:声明强引用 引用计数+1 retainCount
weak:弱引用 不引用
retain:strong同样的功能
copy:复制一个同样的对象(创建一片内存,将对象的内容拷贝到这片独立的内存)(拷贝的多了占用很多内存,所以不好)
readWrite:默认-可读(有getter方法) 可写(setter)
readOnly:只读(同上)
setter:使用方式setter=setCatName:
getter:使用方式getter=getCatName:
assign:C语言的基本数据类型
举例:
@property (nonatomic,strong) NSString *address;
@property (nonatomic,assign) float age;
知识点三:关于[]调用 和.
Cat *jfm=[[Cat alloc]init];
jfm.address=@"桃园";
等同于 [jfm setAddress:@"桃园"]; //set方法需要写出 方法名:参数
NSLog(@"%@ %@",jfm.address);
等同于NSLog(@"%@ %@",[jfm name]); // get方法只需要直接写参数名name就可以了
.h中内容供参考:@property (nonatomic,strong)NSString *name;
//- (void)setName:(NSString *)name;
//- (NSString *)name;
@property (nonatomic, strong) NSString *address;
//- (void)setAddress:(NSString *)address;
//- (NSString *)address;
参考资料:
实例变量和属性的区别:http://zhidao.baidu.com/question/1960023972532644380.html?fr=iks&word=oc%B3%C9%D4%B1%B1%E4%C1%BF%D4%F5%C3%B4%CA%B5%CF%D6&ie=gbk
oc中的Set函数、Get函数、点语法和类方法等http://bbs.itheima.com/thread-139714-1-1.html
附:实验代码
//
// main.m
// Review
//
// Created by PengXiaodong on 15/6/30.
// Copyright (c) 2015年 PengXiaodong. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Person.h"
#import "Cat.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
//实例方法 类方法
Person *pxd = [[Person alloc] init];
[pxd setAge:28];
NSLog(@"%d", [pxd age]);
//创建一个字符串对象
//NSString *name = [[NSString alloc] initWithString:@"iOS开发"];
Cat *jfm = [[Cat alloc] init];
jfm.name = @"西南大学"; //调用name变量的set方法
[jfm setName:@"西南大学"];
jfm.address = @"橘园";
[jfm setAddress:@"橘园"];
NSLog(@"%@ %@", jfm.name, jfm.address);//调用get方法
NSLog(@"%@ %@", [jfm name], [jfm address]);//调用get方法
}
return 0;
}
//
// Cat.h
// Review
//
// Created by PengXiaodong on 15/6/30.
// Copyright (c) 2015年 PengXiaodong. All rights reserved.
//
#import <Foundation/Foundation.h>
/*
旧的变量声明的方式存在一个弊端
1. 繁琐 每一个变量都需要提供一个set方法 get方法 同时需要去实现这个两个方法
解决上面的问题
property-声明了变量的set get方法
synthesize-实现了set get方法
*/
/*
@property属性变量
1. 声明了setter方法
2. 声明了getter方法
3. 声明了一个变量 这个变量本身的名字是 _name
- (void)setName:(NSString *)name;
- (NSString *)name;
*/
/*
关键字
nonatomic:非原子操作 线程不安全(没有加锁 解锁机制) 效率高
atomic:原子操作 线程安全(有加锁 解锁机制) 默认 效率低
->OC对象类型 strong/retain
strong:声明强引用 引用计数+1 retainCount
weak: 弱引用 不引用
retain:strong同样的功能
copy:复制一个同样的对象(创建一片内存,将对象的内容拷贝到这片独立的内存)
readWrite:默认-可读(有getter方法)可写(有setter方法)
readOnly:只能读(只有getter方法 没有setter方法)
setter: 使用方式setter=setCatname:
getter: 使用方式getter=getCatName
assign: C语言的基本数据类型
*/
@interface Cat : NSObject
@property (nonatomic, strong) NSString *name;
//- (void)setName:(NSString *)name;
//- (NSString *)name;
@property (nonatomic, strong) NSString *address;
//- (void)setAddress:(NSString *)address;
//- (NSString *)address;
@property (nonatomic, assign) float age;
@end
//
// Cat.m
// Review
//
// Created by PengXiaodong on 15/6/30.
// Copyright (c) 2015年 PengXiaodong. All rights reserved.
//
#import "Cat.h"
@implementation Cat
//@synthesize name = _name;//完成了set方法 get方法的实现
@end
//
// Person.h
// Review
//
// Created by PengXiaodong on 15/6/30.
// Copyright (c) 2015年 PengXiaodong. All rights reserved.
//
#import <Foundation/Foundation.h>
/*
旧的变量声明的方式存在一个弊端
1. 繁琐 每一个变量都需要提供一个set方法 get方法 同时需要去实现这个两个方法
解决上面的问题
property-声明了变量的set get方法
synthesize-实现了set get方法
*/
@interface Person : NSObject{
//声明变量
int age;//成员变量
}
//定义方法
//set方法 设置变量的值
- (void)setAge:(int)aAge;
//get方法 后去变量的值
- (int)age;
@end
//
// Person.m
// Review
//
// Created by PengXiaodong on 15/6/30.
// Copyright (c) 2015年 PengXiaodong. All rights reserved.
//
#import "Person.h"
@implementation Person
- (void)setAge:(int)aAge{
age = aAge;
}
- (int)age{
return age;
}
@end