3

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

有任何想法吗??

4

3 回答 3

5

使用关联引用- 这很棘手,但这是专门为您的用例发明的机制。

这是上面链接中的一个示例:首先,您定义一个引用并将其添加到您的对象中,使用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];
于 2012-12-07T04:56:13.103 回答
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];
于 2012-12-07T05:00:13.607 回答
0

完全取决于你想要做什么,这个问题很模糊,但如果你想要几个对象或几个整数等等,数组是要走的路。假设您有一个包含 100 个数字的列表。你可以做这样的事情:

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 在代码中创建自定义对象或变量的数组将非常容易。

于 2012-12-07T05:08:21.090 回答