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

自学iOS开发系列----OC(属性、点语法、修饰符)

2016-11-29 15:03 399 查看
属性和点语法

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息