第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在運行時向?qū)ο筇砑訉傩裕?/h1>

是否可以在運行時將屬性添加到Objective C對象?如何在運行時向?qū)ο筇砑訉傩裕?
查看完整描述

3 回答

?
jeck貓

TA貢獻1909條經(jīng)驗 獲得超7個贊

可以通過class_addProperty()以下方式向類添加形式屬性:


BOOL class_addProperty(Class cls,

    const char *name,

    const objc_property_attribute_t *attributes,

    unsigned int attributeCount)

前兩個參數(shù)是不言自明的。第三個參數(shù)是屬性的屬性的陣列,并且每個屬性特性是一個名稱-值對,其遵循的Objective-C 型編碼對聲明的屬性。請注意,文檔中仍然提到了逗號分隔的字符串,用于屬性屬性的編碼。逗號分隔的字符串中的每個段均由一個objc_property_attribute_t實例表示。此外,objc_property_attribute_t除了的通用@類型編碼外,還接受類名稱id。


這里有一個程序,動態(tài)地增加了一個叫做物業(yè)的初稿name到已被稱為實例變量類_privateName:


#include <objc/runtime.h>

#import <Foundation/Foundation.h>


@interface SomeClass : NSObject {

    NSString *_privateName;

}

@end


@implementation SomeClass

- (id)init {

    self = [super init];

    if (self) _privateName = @"Steve";

    return self;

}

@end


NSString *nameGetter(id self, SEL _cmd) {

    Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");

    return object_getIvar(self, ivar);

}


void nameSetter(id self, SEL _cmd, NSString *newName) {

    Ivar ivar = class_getInstanceVariable([SomeClass class], "_privateName");

    id oldName = object_getIvar(self, ivar);

    if (oldName != newName) object_setIvar(self, ivar, [newName copy]);

}


int main(void) {

    @autoreleasepool {

        objc_property_attribute_t type = { "T", "@\"NSString\"" };

        objc_property_attribute_t ownership = { "C", "" }; // C = copy

        objc_property_attribute_t backingivar  = { "V", "_privateName" };

        objc_property_attribute_t attrs[] = { type, ownership, backingivar };

        class_addProperty([SomeClass class], "name", attrs, 3);

        class_addMethod([SomeClass class], @selector(name), (IMP)nameGetter, "@@:");

        class_addMethod([SomeClass class], @selector(setName:), (IMP)nameSetter, "v@:@");


        id o = [SomeClass new];

        NSLog(@"%@", [o name]);

        [o setName:@"Jobs"];

        NSLog(@"%@", [o name]);

    }

}

其(修剪后的)輸出:


Steve

Jobs

應(yīng)該更加仔細地編寫getter和setter方法,但這足以作為如何在運行時動態(tài)添加形式屬性的示例。


查看完整回答
反對 回復(fù) 2019-12-16
?
猛跑小豬

TA貢獻1858條經(jīng)驗 獲得超8個贊

如果您查看此處NSKeyValueCoding記錄的協(xié)議,則可以看到一條消息:


- (id)valueForUndefinedKey:(NSString *)key

您應(yīng)該重寫該方法以為指定的undefined屬性提供自定義結(jié)果。當然,這假定您的類使用相應(yīng)的協(xié)議。


這種方法通常用于向類提供未知的行為(例如,不存在的選擇器)。


查看完整回答
反對 回復(fù) 2019-12-16
?
暮色呼如

TA貢獻1853條經(jīng)驗 獲得超9個贊

否(即,使用點語法等)。但是您可以使用關(guān)聯(lián)對象來添加存儲:如何在對象內(nèi)部使用objc_setAssociatedObject / objc_getAssociatedObject?。

查看完整回答
反對 回復(fù) 2019-12-16
  • 3 回答
  • 0 關(guān)注
  • 539 瀏覽

添加回答

了解更多

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號