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

属性和点语法
1.成员变量和属性
属性用@property来表示,自动生成setter和getter方法来操作变量。
成员变量需要手动生成setter和getter方法来操作变量。

利用成员变量和属性分别对LOL中的英雄名字赋值并输出赋值后的英雄名字:
①成员变量
新建Hero类
Hero.h文件

#import 

@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 
#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 

@interface Hero : NSObject

@property NSString * name;

@end

Hero.m文件 (不做任何处理)

main.m文件

#import 
#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 

@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 
#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 

@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 
#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;
}

你可能感兴趣的:(iOS开发)