為什麼category可以新增方法不能新增變數

2021-07-09 11:09:15 字數 1287 閱讀 3076

oc是不能直接修改物件的結構體的成員變數屬性,一般做法是先取出物件的結構體變數,修改該取出來的結構體變數裡面的成員,再把結構體物件賦值給原來的結構體變數,在ui中為了簡化**一般對uiview做乙個category,這個分類把上面修改結構體成員變數的方法封裝起來,

@inte***ce uiview (extension)

@property(nonatomic,assign)cgfloat x;

@property(nonatomic,assign)cgfloat y;

@end

#import"uiview+extension.h"

@implementationuiview (extension)

- (void)setx:(cgfloat)x

- (void)sety:(cgfloat)y

@end

問題來了,category是為已有的類動態新增新的行為,不能新增新的成員變數,在.h檔案中為什麼新增了x和y的變數?

這個就要弄清@property關鍵字了,在類中@property關鍵字會生成私有成員變數,和申明getter setter方法,但是在分類中只會宣告getter和setter方法,不會生成成員變數

擴充套件: 如果在.m中手動實現了setter和getter方法,x-code就不會自動生成@synthesize,也就不會生成成員變數

點語法訪問的是getter方法,物件的->呼叫才是訪問的成員變數

如果我們真的需要給category增加屬性的實現,需要借助於執行時的兩個函式:

objc_setassociatedobject

objc_getassociatedobject

4.4後,@property就獨攬了@property和@synthesize的功能。

(2)@property int age;這句話完成了3個功能:1)生成_age成員變數的get和set方法的宣告;2)生成_age成員變數set和get方法的實現;3)生成乙個_age的成員變數。

注意:這種方式生成的成員變數是private的。

_age為protected的。

(4)原則:get和set方法同變數一樣,如果你自己定義了,那麼就使用你已經定義的,如果沒有定義,那麼就自動生成乙個。

(5)手動實現:

1)如果手動實現了set方法,那麼編譯器就只生成get方法和成員變數;

2)如果手動實現了get方法,那麼編譯器就只生成set方法和成員變數;

3)如果set和get方法都是手動實現的,那麼編譯器將不會生成成員變數。

js 的function為什麼可以新增屬性

1 function person 2 function person person.name tom 3 function person person.prototype.name tom 1是公有屬性 2是靜態屬性 3是原型共享屬性 解釋1 因為 js 裡,函式也是物件,是 function 的...

runtime為什麼可以動態新增變數和方法?

先介紹兩個結構體 1.類中每乙個方法在內部轉換後的結構體 structobjc method 注 每乙個例項化物件都有乙個isa指標,通過isa,這個物件可以訪問其類的結構,進而訪問繼承的類的結構 呼叫class addmethod新增成員方法的步驟 1.定義乙個要新增的方法 2.建立objc me...

為什麼 DOCTYPE 只用新增 就可以了

doctype 是 document type 文件的型別 的縮寫,在web中你要告訴瀏覽器你的xhtml或者html是用的什麼版本,能夠讓瀏覽器根據你宣告的版本來解析html文件,不寫 doctype 你的標識和css都不會生效。位於html第一行,他在html中的doctype有兩個主要目的。1...