2010-01-19 72 views
0

我有1个NSString * abc = @“Hardik”; 我有NSMutableArray *数组; 现在我写了[array addobject:abc];然后我打印,NSLog(@“array =%@”,array);与NSString有关的问题

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

和我有综合它,但获得价值NULL 我无法理解它?

回答

3

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

4

您还需要初始化您的数组:

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

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

0

这听起来像你的NSMutableArray *数组属性可能没有被初始化?

你可以发布你的类的init方法吗?

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); 

...工作,而逆向会返回一个空的数组。

所以规则是:

  1. 在一个类实现 (包括子类),称只是 propertyName给你的财产的地址 但不调用 的的getter/setter存取方法。
  2. 在一个类实现 (包括子类),使用 self.propertyName调用 的getter/setter存取方法,但 不直接访问属性。
  3. 来自课外 的实现例如 myClass.propertyName调用 getter/setter访问器方法。