属性和点语法
1.成员变量和属性
属性用@property来表示,自动生成setter和getter方法来操作变量。
成员变量需要手动生成setter和getter方法来操作变量。
利用成员变量和属性分别对LOL中的英雄名字赋值并输出赋值后的英雄名字:
①成员变量
新建Hero类
Hero.h文件
#import <Foundation/Foundation.h>
@interface Hero : NSObject {
NSString * _name;
}
- (void)setName:(NSString *)name;
- (NSString *)name;
@end
Hero.m文件
#import "Hero.h"
@implementation Hero
- (void)setName:(NSString *)name {
_name = name;
}
- (NSString *)name {
return _name;
}
@end
main.m文件
#import <Foundation/Foundation.h>
#import "Hero.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Hero * hero = [[Hero alloc] init];
[hero setName:@"赵丽颖"];
NSString * strName = [hero name];
NSLog(@"LOL中英雄姓名:%@",strName);
}
return 0;
}
②属性
新建Hero类
Hero.h文件
#import <Foundation/Foundation.h>
@interface Hero : NSObject
@property NSString * name;
@end
Hero.m文件 (不做任何处理)
main.m文件
#import <Foundation/Foundation.h>
#import "Hero.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Hero * hero = [[Hero alloc] init];
//hero.name在等号左边就是set方法
hero.name = @"赵丽颖";
//hero.name在等号右边就是get方法
NSString * strName = hero.name;
NSLog(@"LOL中英雄姓名:%@",strName);
}
return 0;
}
【注】点语法只是访问setter getter方法,不是使用成员变量
2.通过点语法,创建一个学生类,并对属性进行存取:姓名(name), 年龄(age), 身高(height)
新建Student类
Student.h文件
#import <Foundation/Foundation.h>
@interface Student : NSObject
@property NSString * name;
@property int age;
@property float height;
- (void)logStudentInfo;
@end
Student.m文件
#import "Student.h"
@implementation Student
- (void)logStudentInfo {
NSLog(@"姓名 = %@\n年龄 = %d\n身高 = %f\ng",self.name,self.age,self.height);
}
@end
main.m文件
#import <Foundation/Foundation.h>
#import "Student.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Student * student = [[Student alloc] init];
student.name = @"唐嫣";
student.age = 23;
student.height = 175.5;
[student logStudentInfo];
}
return 0;
}
修饰符
1.atomic和nonatomic
atomic表示是线程安全
nonatomic表示是非线程安全的,使用此属性性能会提高一些。(项目实战中大多数情况下使用此方法,atomic不作考虑)
@property (atomic) NSString * name;
@property (nonatomic) NSString * sex;
2.readonly和readwrite
readonly表明这个属性只能读不能写,系统只为我们创建一个getter方法,不会创建setter方法
readwrite表明这个属性是可读可写的,系统为我们创建这个属性的setter和getter方法
@property (readonly) NSString * name;
@property (readwrite) NSString * sex;
3.assign
assign表示直接赋值,用于基本数据类型(NSUInteger和CGFloat)和C数据类型(int,float,double,char等),另外还有id类型,这个修饰符不会涉及到内存管理,但是如果是对象类型,使用此修饰符则可能会导致内存泄漏或EXC_BAD_ACCESS错误
@property (assign) int age;
4.copy
copy主要用在NSString类型,表示复制内容
@property (copy) NSString * name;
5.strong、weak和retain
strong、weak和retain针对对象类型进行内存管理,如果对基本数据类型使用,则Xcode直接会报错。(此内容后面文章会详述,现阶段仅会使用即可)
ARC中使用strong表示强引用,weak表示弱引用
MRC中使用retain来管理内存
@property (strong) NSArray * names;
【注】一个属性可以添加多个修饰符,多个修饰符用逗号隔开
6.创建一个账户类,属性包括:姓名(),账户号码(),存储金额(),关联的电话号码()
新建Account类
Account.h文件
#import <Foundation/Foundation.h>
@interface Account : NSObject
@property (nonatomic,copy) NSString * name;
@property (nonatomic,assign) int number;
@property (nonatomic,assign) float money;
@property (nonatomic,retain) NSMutableArray* phoneNums;
- (Account *)init;
@end
Account.m文件
#import "Account.h"
@implementation Account
- (Account *)init {
if (self = [super init]) {
//实例化
self.phoneNums = [[NSMutableArray alloc] init];
}
return self;
}
@end
main.m文件
#import <Foundation/Foundation.h>
#import "Account.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Account * account = [[Account alloc] init];
account.name = @"赵丽颖";
account.number = 62122602;
account.money = 23456.67;
[account.phoneNums addObject:@"15711097547"];
[account.phoneNums addObject:@"13520865432"];
NSLog(@"姓名:%@,账户号码:%d,存储金额:%f",account.name,account.number,account.money);
NSLog(@"关联电话:%@",account.phoneNums);
}
return 0;
}