iOS中實例變量、成員變量和屬性變量的區別

作爲iOS開發,會經常聽到成員變量、實例變量和屬性;那他們有什麼區別嗎?

實例變量

實例變量: class類進行實例化出來的對象爲實例對象;比如:

Person *p = [Person new];

成員變量

成員變量:{ }中所聲明的變量都是成員變量(實例變量是一種特殊的成員變量)。其中的hell、btn也是實例對象,id是一種特殊的class,是OC特有的對象。成員變量是私有變量,外部不會獲取到。

@interface Person : NSObject{
    @public
    NSString *myName; //成員
    id hell; // id - > class
    UIButton *btn;
    int age;
}

屬性變量

屬性變量: 屬性是與其他對象交互的變量,會生成默認的setter和getter方法。蘋果早期的編譯器是GCC,後來發展到LLVM,LLVM在沒有匹配實例變量的額屬性時會自動創建一個帶下劃線的成員變量。注意:分類中添加的屬性是不會自動生成setter和getter方法的,必須要手動添加。如果已經手動實現了get和set方法的話Xcode不會再自動生成帶有下劃線的私有成員變量了,因爲xCode自動生成成員變量的目的就是爲了根據成員變量而生成get/set方法的,但是如果get和set方法缺一個的話都會生成帶下劃線的變量。

給分類添加屬性

.h文件

#import <Foundation/Foundation.h>

@interface NSObject (Person)

@property (nonatomic, copy) NSString *name;

@end

.m文件

#import "NSObject+Person.h"
#import <objc/runtime.h> /*或者 #import <objc/message.h>*/
static NSString *nameKey = @"nameKey"; // name的key

@interface NSObject ()

@end

@implementation NSObject (Person)

/**
 setter方法
 */
- (void)setName:(NSString *)name {
    objc_setAssociatedObject(self, &nameKey, name, OBJC_ASSOCIATION_COPY);
}

/**
 getter方法
 */
- (NSString *)name {
    return objc_getAssociatedObject(self, &nameKey);
}
@end

使用:

- (void)viewDidLoad {
    NSObject *objc = [[NSObject alloc] init];
    objc.name = @"Vincent";
    NSLog(@"%@", objc.name);
}
@property@synthesize

@synthesize讓編譯器自動生成setter和getter,可以制定屬性對應的成員變量。

在Xcode4.4版本之前@property@synthesize的功能是獨立分工的:

  1. @property的作用是:自動的生成成員變量set/get方法的聲明如代碼:

       @property int age; // 它的作用和下面兩行代碼的作用一致
       - (void)setAge:(int)age;
       - (int)age;
    

    注意:屬性名稱不要加前綴下劃線,否則生成的get/set方法中也會有下劃線_

  2. @synthesize的作用是實現@property定義的方法代碼如:

      @synthesize age
    

    @property中定義的屬性自動生成get/set的實現方法而且默認訪問成員變量age,如果指定訪問成員變量_age的話代碼如:

     @synthesize age = _age;
    

    把@property中聲明的age成員變量生成get/set實現方法,並且在實現方法內部訪問_age這個成員變量,也就意味着給成員_age賦值。

注意:訪問成員變量 _age 如果在.h文件中沒有定義_age成員變量的話,就會在.m文件中自動生成@private類型的成員變量_age

該文章爲記錄本人的學習路程,希望能夠幫助大家,也歡迎大家點贊留言交流!!!文章地址:https://www.jianshu.com/p/1027c9d8359e

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章