与NSString相关的问题

时间:2010-01-19 14:26:10

标签: iphone objective-c cocoa

我有1个NSString * abc = @“Hardik”; 我有NSMutableArray *数组; 现在我写了[array addobject:abc];

然后我打印,NSLog(@“array =%@”,数组);

但我得到了NULL 为什么? 我已经声明了NSMutableArray *数组;在a.h文件中 我设置了@property(nonatomic,retain)NSMutableArray *数组; @synthesize数组;​​

我已经合成它但得到的值为NULL 我无法理解它?

4 个答案:

答案 0 :(得分:4)

您还需要初始化数组:

array = [[NSMutableArray alloc] initWithCapacity:10];

这是非常基本的东西。你读过“Learning Objective C Primer”吗?

答案 1 :(得分:3)

听起来你实际上没有分配array。通常,您可以在初始化程序中执行此操作。 (不要忘记在release方法中添加dealloc。)@synthesize创建getter和setter,但您仍然必须自己处理分配/解除分配对象。 / p>

答案 2 :(得分:0)

听起来您的NSMutableArray *数组属性可能尚未初始化?

你可以发布你的班级初始化方法吗?

答案 3 :(得分:0)

要在类本身内触发合成访问器,必须使用self。如果不这样做,则直接绕过访问器方法访问属性的地址。你需要:

NSString *abc = @"Hardik";
[self.array addobject:abc];
NSLog(@"array = %@", self.array);

这一点很重要的原因是合成方法通常也会初始化属性。合成数组方法的内部结构如下:

-(NSArray *) array{
    if (array!=nil) {
        return array;
    }
    array=[[NSMutableArray alloc] initWithCapacity:1];
    return array;
}

self.propertyName实际上只是[self propertyName]的简写,self.propertyName=someValue只是[self setPropertyName:someValue]的简写。

在您至少致电self.array一次之前, 数组属性未初始化

然而,只是为了混淆事情,一旦你初次化了self.array,你就可以直接拨打array。所以......

[self.array addObject:abc];
NSLog(@"array = %@", array);

...工作,而converse只返回一个空数组。

所以规则是:

  1. 在类实现中 (包括子类),只调用 propertyName为您提供地址 属性但不打电话 getter / setter访问器方法。
  2. 在类实现中 (包括子类),使用 self.propertyName打电话给。{ getter / setter访问器方法但是 不直接访问属性。
  3. 来自课外 实施例如 myClass.propertyName打电话给。{ getter / setter访问器方法。