在运行时创建实例变量

时间:2012-12-07 04:49:52

标签: objective-c ios

我想在运行时动态创建实例变量,我想将这些变量添加到一个类别中。实例变量的数量可能会根据我用于定义它们的配置/属性文件而更改。

任何想法??

3 个答案:

答案 0 :(得分:5)

使用Associative References - 这很棘手,但这是专门针对您的用例而发明的机制。

以下是上述链接中的示例:首先,您使用objc_setAssociatedObject定义引用并将其添加到对象中;然后,您可以通过调用objc_getAssociatedObject来恢复该值。

static char overviewKey;

NSArray *array = [[NSArray alloc] initWithObjects:@ "One", @"Two", @"Three", nil];
NSString *overview = [[NSString alloc] initWithFormat:@"%@", @"First three numbers"];

objc_setAssociatedObject (
    array,
    &overviewKey,
    overview,
    OBJC_ASSOCIATION_RETAIN
);
[overview release];

NSString *associatedObject = (NSString *) objc_getAssociatedObject (array, &overviewKey);
NSLog(@"associatedObject: %@", associatedObject);

objc_setAssociatedObject (
    array,
    &overviewKey,
    nil,
    OBJC_ASSOCIATION_ASSIGN
);
[array release];

答案 1 :(得分:1)

我倾向于使用NSMutableDictionary(请参阅NSMutableDictionary Class Reference)。因此,你会有一个ivar:

NSMutableDictionary *dictionary;

然后你要初始化它:

dictionary = [NSMutableDictionary dictionary];

然后,您可以在代码中动态保存值,例如:

dictionary[@"name"] = @"Rob";
dictionary[@"age"] = @29;

// etc.

或者,如果您正在从文件中读取并且不知道密钥的名称将是什么,您可以通过编程方式执行此操作,例如:

NSString *key = ... // your app will read the name of the field from the text file
id value = ...      // your app will read the value of the field from the text file

dictionary[key] = value;  // this saves that value for that key in the dictionary

如果您使用的是旧版Xcode(4.5之前),则语法为:

[dictionary setObject:value forKey:key];

答案 2 :(得分:0)

取决于你想要做什么,问题是模糊的,但如果你想拥有几个对象或几个整数等,那么数组就是最佳选择。假设您有一个包含100个数字列表的plist。你可以做一些像这样的事情:

NSArray * array = [NSArray arrayWithContentsOfFile:filePath];
// filePath is the path to the plist file with all of the numbers stored in it as an array

这会给你一个NSNumbers数组,如果你想这样,你就可以把它变成一个刚出的数组;

int intArray [[array count]];  
for (int i = 0; i < [array count]; i++) {
    intArray[i] = [((NSNumber *)[array objectAtIndex:i]) intValue];
}

每当你想从某个位置得到一个整数时,假设你要看第5个整数,你会这样做:

int myNewInt = intArray[4];
// intArray[0] is the first position so [4] would be the fifth

只需研究使用plist来提取数据,通过解析plist就可以很容易地在代码中创建自定义对象或变量数组。