Có thể thêm thuộc tính vào đối tượng C Mục tiêu trong thời gian chạy không?Làm cách nào để thêm thuộc tính vào đối tượng trong thời gian chạy?
Trả lời
Có thể thêm các thuộc tính chính thức cho một lớp học qua class_addProperty()
:
BOOL class_addProperty(Class cls,
const char *name,
const objc_property_attribute_t *attributes,
unsigned int attributeCount)
Hai thông số đầu tiên là tự giải thích. Tham số thứ ba là một mảng thuộc tính thuộc tính và mỗi thuộc tính thuộc tính là cặp tên-giá trị theo Mục tiêu-C type encodings cho declared properties. Lưu ý rằng tài liệu vẫn đề cập đến chuỗi được phân tách bằng dấu phẩy cho việc mã hóa thuộc tính thuộc tính. Mỗi phân đoạn trong chuỗi được phân tách bằng dấu phẩy được thể hiện bằng một ví dụ objc_property_attribute_t
. Ngoài ra, objc_property_attribute_t
chấp nhận tên lớp ngoài mã hóa loại @
chung của id
.
Dưới đây là một dự thảo đầu tiên của một chương trình tự động bổ sung thêm một tính chất gọi là name
đến một lớp học mà đã có một biến Ví dụ gọi _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, "[email protected]:@");
id o = [SomeClass new];
NSLog(@"%@", [o name]);
[o setName:@"Jobs"];
NSLog(@"%@", [o name]);
}
}
của nó (tỉa) đầu ra:
Steve
Jobs
Các phương thức getter và setter nên được viết cẩn thận hơn nhưng điều này đủ để làm ví dụ về cách tự động thêm một thuộc tính chính thức khi chạy.
class_addProperty trả về true, nhưng class_getInstanceVariable luôn trả về 0. Tôi đã thử đặt tên thuộc tính thay vì tên ngà, nhưng vẫn không có may mắn. Bất kỳ ý tưởng gì có thể là vấn đề? – Mercurial
@Bavarious, bạn đánh lừa như thế nào? Tôi có nghĩa là [o tên] kết quả trong lỗi biên dịch 'Không có phương pháp ví dụ nào cho tên bộ chọn' '. –
@HiteshSavaliya một thời gian dài trước đây (trước ARC) điều này là có thể. ngày nay bạn phải khai báo bộ chọn '-name'. – Michael
@properties - không (tức là sử dụng cú pháp dấu chấm v.v.). Nhưng bạn có thể thêm bộ nhớ bằng cách sử dụng các đối tượng được liên kết: How do I use objc_setAssociatedObject/objc_getAssociatedObject inside an object?.
Nếu bạn có một cái nhìn tại NSKeyValueCoding
giao thức, tài liệu here, bạn có thể thấy rằng có một thông điệp kêu gọi:
- (id)valueForUndefinedKey:(NSString *)key
Bạn nên ghi đè lên rằng phương pháp để cung cấp kết quả tùy chỉnh của bạn cho các tài sản không xác định cụ thể. Tất nhiên điều này giả định rằng lớp của bạn sử dụng giao thức tương ứng.
Cách tiếp cận này thường được sử dụng để cung cấp hành vi không xác định cho các lớp (ví dụ: bộ chọn không tồn tại).
- 1. Làm cách nào để thêm thuộc tính vào lớp trong thời gian chạy trong C#?
- 2. C#: Làm thế nào để thêm một thuộc tính vào một đối tượng tại thời gian chạy?
- 3. Khuôn khổ thực thể: Thêm thuộc tính/đối tượng trong thời gian chạy
- 4. Java - Thuộc tính: Thêm khóa mới vào tệp thuộc tính trong thời gian chạy?
- 5. Thêm phút vào đối tượng Thời gian
- 6. Thêm thành viên vào đối tượng động trong thời gian chạy
- 7. Thêm các thông tin thêm thời gian chạy vào đối tượng activerecord
- 8. Tự động thêm thuộc tính C# tại thời gian chạy
- 9. Tự động thêm thuộc tính vào đối tượng động?
- 10. Cách thêm UIButton vào thời gian chạy
- 11. Thêm thời gian vào đối tượng POSIXct trong R
- 12. Lặp qua tất cả các thuộc tính đối tượng tại thời gian chạy
- 13. javascript thêm một phút vào đối tượng thời gian
- 14. Thuộc tính động Objective-C trong thời gian chạy?
- 15. Kích thước của một đối tượng trong thời gian chạy
- 16. Thêm hình ảnh trong thời gian chạy
- 17. Làm cách nào để thêm lề vào một Nút tại thời gian chạy?
- 18. Làm cách nào để thêm thuộc tính vào tệp topojson?
- 19. Cách thêm nút MvcSitemapProvider mới vào thời gian chạy
- 20. Làm thế nào để thêm thuộc tính vào nút Nokogiri?
- 21. Tìm tham chiếu đến đối tượng trong thời gian chạy
- 22. Làm cách nào để thêm tiền tố không gian tên vào đối tượng DOM XML?
- 23. mã chạy tùy thuộc vào thời gian trong ngày
- 24. Làm cách nào để thêm mục trong thanh tác vụ trong thời gian chạy
- 25. Làm cách nào để ngăn jQuery chèn các thuộc tính 'xmlns' vào một đối tượng XML?
- 26. không phụ thuộc vào thời gian chạy maven
- 27. java cập nhật các thuộc tính tệp thời gian chạy
- 28. Làm cách nào để truy cập Thuộc tính thời gian chạy do người dùng xác định từ đối tượng 'người gửi'?
- 29. Cố gắng thêm nhiều thuộc tính vào đối tượng Javascript bằng cách sử dụng vòng lặp
- 30. Thay đổi thuộc tính log4j tại thời gian chạy
nếu nó tuân thủ giao thức KVC - có thể là – Nekto
Bạn có ý nghĩa gì bởi các thuộc tính? Mục tiêu-C khai báo tài sản? –
Ý tôi là @property – cfischer