五.屬性和實(shí)體變量常用寫法與用法

1.屬性常見用法匯總

//  HuNurseModel.h
/**
 *  護(hù)士模型
 */

#import <Foundation/Foundation.h>

@interface HuNurseModel : NSObject
{
    //1.不用定義如下實(shí)體變量會(huì)自動(dòng)生成
//    NSString *_firstName;
//    NSString *_lastName;
}
//2.不需要外部對(duì)象修改時(shí)用readonly屬性,<一般ios性能問題考慮都用nonatomic修飾>
@property (nonatomic, copy, readonly)NSString *firstName;
@property (nonatomic, copy, readonly)NSString *lastName;

//4.1一般我們不用getter方法,除非下面這種命名規(guī)范,一般bool類型以is開頭(對(duì)屬性存取重命名用)
@property (nonatomic, getter = isLeader) BOOL leader; //是否是領(lǐng)導(dǎo)  護(hù)士長(zhǎng)

//5.0 該屬性準(zhǔn)備用戶自己創(chuàng)建
@property(nonatomic, copy) NSString *content; //

- (id)initWithFirstName:(NSString *)firstName
               lastName:(NSString *)lastName;

- (id)initWithFirstName:(NSString *)firstName
               lastName:(NSString *)lastName
                 isLead:(BOOL)flag;

@end
//  HuNurseModel.m
#import "HuNurseModel.h"

@implementation HuNurseModel

//5.1 告訴編譯器不要?jiǎng)?chuàng)建存取方法(set get兩個(gè)都不創(chuàng)建),實(shí)例變量也不會(huì)創(chuàng)建。
     //(5.1)如果你只要一個(gè)方法自己創(chuàng)建,另一個(gè)系統(tǒng)創(chuàng)建,不要定義@dynamic。直接寫自己創(chuàng)建的方法就可以
@dynamic content;

- (id)initWithFirstName:(NSString *)firstName
               lastName:(NSString *)lastName
{
    if((self = [super self])){
        _firstName = [firstName copy]; //3.初始化類型要和屬性定義類型一一對(duì)應(yīng)
        _lastName = [lastName copy];
    }
    return  self;
}

- (id)initWithFirstName:(NSString *)firstName
               lastName:(NSString *)lastName
                 isLead:(BOOL)flag
{
    self = [self initWithFirstName:firstName lastName:lastName];
    if(self){
        _leader = flag;
    }
    return  self;
}

//4.2使用的使用 用isLead就可以
- (BOOL)isLead
{
    return _leader;
}

//5.2 自己實(shí)現(xiàn)set方法
-(void)setContent:(NSString *) src {
    if ([src length] > 0) {
        //個(gè)性化處理
    }
}
@end

2.實(shí)例變量建議寫入的時(shí)候用self. 讀取用實(shí)例變量_var

原因self.的方式其實(shí)本質(zhì)是調(diào)用 set 或get方法,可能會(huì)copy新對(duì)象(如果只是取值效率用函數(shù)會(huì)偏低)

其他特殊使用場(chǎng)景說明
a.init初始化變量時(shí)盡量用_var

//  HuNurseModel.h
//科室
@interface HuDepartmentClass : NSObject
@property(nonatomic, copy) NSString *departName;
@end

//外科
@interface HuSurgeyDepClass : HuDepartmentClass
//  HuNurseModel.m
@implementation HuDepartmentClass

-(id)init
{
    self = [super init];
    if(self){
        //6.如果用self. 會(huì)導(dǎo)致子類都會(huì)觸發(fā)異常,這里應(yīng)該用_departName
//        self.departName = @"";
        _departName = @"";
    }

    return self;
}

@end
@implementation HuSurgeyDepClass
//子類重寫父類set方法
- (void)setDepartName:(NSString *)departName
{
    if(![departName isEqualToString:@"外科"]){
        [NSException raise:NSInvalidArgumentException format:@"科室要為外科"];
    }
    self.departName = departName;
}

b.子類訪問父類的實(shí)例變量 要用self.

//  HuNurseModel.h
//護(hù)理部主任
@interface HuNurseMaster : HuNurseModel
@end
//  HuNurseModel.m
@implementation HuNurseMaster

-(NSString*)getFullName
{
    //7.直接調(diào)用父類的實(shí)例變量 會(huì)無法訪問,應(yīng)該用self.方法
//    return [NSString stringWithFormat:@"%@ %@",_firstName,_lastName];
    return [NSString stringWithFormat:@"%@ %@",self.firstName,self.lastName];
}

c.以下場(chǎng)景建議用self. 方法 (調(diào)試斷點(diǎn)和KVO觀察)

3.lazy機(jī)制(使用時(shí)才創(chuàng)建,不使用不創(chuàng)建)<帶有setget方法>

//  HuNurseModel.h

//外科
@interface HuSurgeyDepClass : HuDepartmentClass
@property (weak, nonatomic, readonly) UIImageView *gifView; //頭像視圖

@end
//  HuNurseModel.m

@implementation HuSurgeyDepClass

//8.get方法 又可以有set函數(shù)的功能
- (UIImageView *)gifView
{
    if (!_gifView) {
        UIImageView *gifView = [[UIImageView alloc] init];
        [self addSubview:_gifView = gifView];
    }
    return _gifView;
}

@end

如果你發(fā)現(xiàn)本文對(duì)你有所幫助,如果你認(rèn)為其他人也可能受益,請(qǐng)把它分享出去。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容