Objective C中屬性的封裝

2021-08-16 05:21:53 字數 1977 閱讀 2845

封裝 類就是更高階別的封裝.類將資料和行為封裝為了1個整體. 

好處: 

-> 遮蔽內部的實現.外界不需要知道內部是如何實現的 只需要知道這個物件有什麼用. 

-> 方便操作. 

-> 後期的維護十分的便利.

繼承多型

就是為物件的屬性賦值的時候 語法上其實只要資料的型別是屬性的型別就是可以的. 

但是,情理上這麼做是不合的.

就像person物件有1個int型別的屬性_age 表示1個人的年齡. 

為這個物件的_age屬性賦值的時候 其實只要是int型別的資料 語法上都是完全可以的. 

但是1個人的年齡 正常情況下是在 0-200之間的.

解決的問題: 

在為物件的屬性賦值的時候,我希望將這個資料做1個邏輯驗證. 

如果為屬性賦的值在這個邏輯範圍之內 那麼我們就把這個值賦值給屬性.否則我們就做預設處理.

就像我們希望為person物件的_age屬性賦值的時候,要判斷1下為_age屬性賦的值是不是在0-200之內. 

否則我們就做預設處理.

3.如何實現這個需求

1). 將屬性的@public去掉.因為一旦寫上@public就意味著外界可以直接訪問物件的這個屬性. 

外界一旦可以直接訪問這個屬性 那麼外界就可以任意的為這個屬性賦值 這個時候你攔都攔不住.

去掉@public 外界就無法直接訪問這個屬性 也就無法賦值了.

2). 為類提供1個方法,這個方法專門為這個屬性賦值.這個方法我們叫做setter 

a. 這個方法一定是1個物件方法 因為這個要為屬性賦值. 

b. 這個方法沒有返回值. 因為這個方法做的事情 僅僅是為屬性賦值就可以了. 

c. 這個方法的名稱必須以set開頭. 跟上去掉下劃線首字母大寫的屬性名. 

d. 這個方法一定是有引數的. 引數的型別和屬性的型別一致.引數的名稱和屬性的名稱一致(去掉下劃線) 

e. 在方法的實現中,判斷傳入的資料是否符合邏輯.如果符合邏輯則賦值 否則做預設處理. 

f. 外界想要為物件的屬性賦值 那麼就呼叫這個物件的setter方法 將要賦值的資料傳入給這個方法. 

方法會對這個資料進行驗證 如果符合驗證 就會吧資料賦值給屬性 否則就會做預設處理.

3). 這麼一寫,我們確實可以在為物件的屬性賦值的時候做1個邏輯驗證了. 

但是問題就是 在外界無法取出屬性的值了. 

那就再寫1個方法,專門用來返回屬性的值.這個方法我們叫做getter方法.

a. 這個方法一定是1個物件方法 因為這個方法做的事情是拿到屬性的值返回. 

b. 這個方法肯定有返回值 返回值的型別和屬性的型別一致. 

c. 這個方法的名稱直接就是屬性的名稱(去掉下劃線的) 

d. 這個方法沒有引數 

e. 這個方法的實現是直接將屬性的值返回. 

f. 這個時候,如果外界希望得到屬性的值.那麼就只需要呼叫這個getter方法就可以了.

#import @inte***ce person : nsobject

- (void)setname:(nsstring *)name;

- (nsstring *)name;

- (void)setage:(int )age;

- (int)age;

@end

#import "person.h"

@implementation person

- (void)setname:(nsstring *)name

else

}- (nsstring *)name

- (void)setage:(int )age

else

}- (int)age

@end

#import #import "person.h"

int main(int argc, const char * argv)

Objective C中的屬性特性

assign 用於基本資料型別,直接賦值。也可以用於物件,只不過當setter方法賦值時,只是簡單儲存位址,不會造成引用計數的改變,可以解決迴圈引用問題。retain 用於物件型別,當賦值時,先將舊值釋放,對新值retain引用計數加1 copy 用於物件型別,根據實現的nscopying協議的co...

Objective C中的屬性機制

objective c 2.0中的屬性機制為我們提供了便捷的獲取和設定例項變數的方式,也可以說屬性為我們提供了乙個預設的設定器和訪問器的實現。在學習oc中屬性之前我們先要知道為什麼要為變數實現getter和setter方法,我們先來了解一下例項的作用域。例項變數的作用域如下 1.public 共有的...

Objective C中copy屬性的概述

規範上nsstring做屬性都是寫成copy的,理論上應該是複製了字串而不是單純的增加引用計數,其實問題只會出現在把nsmutablestring賦值給nsstring的時候。objective c inte ce demo nsobject property nonatomic,retain ns...