我现在拥有的是
classA.h A.h
@interface ClassA: NSObject <DelegateA>
-(id)initWithData:(NSData*)data;
+(Stores*)makeClass:(Class) name fromData:(NSData*)data;
@property (assign) NSMutableArray *arr;
@property (assign) RXMLElement *rxmlRoot;
@end
classA.m A.m
-(id)initWithData:(NSData*)data {
self = [super init];
if (self) {
arr = [[NSMutableArray array] retain];
rxmlRoot = [[RXMLElement elementFromXMLData:data] retain];
}
[rxmlRoot iterate:node with:^(RXMLElement *e){ <--------get warning at here
NSLog(@"element is %@",e.tag);
Detail *detail = [[[Detail alloc] init] autorelease];
[detail setLat: [e attribute:@"lat"]];
[detail setLon: [e attribute:@"lon"]];
[arr addObject:detail];
}];
return self;
}
+(classA*)makeClass:(Class) name fromData:(NSData*)data{
ClassA *classA = [[ClassA alloc] initWithData:data];
return [storeClass autorelease] ;
}
和RaptureXML.m
+ (id)elementFromXMLData:(NSData *)data {
return [[[RXMLElement alloc] initFromXMLData:data] autorelease];
}
- (id)initFromXMLData:(NSData *)data {
if ((self = [super init])) {
xml_ = [[TBXML alloc] initWithXMLData:data];
tbxmlElement_ = xml_.rootXMLElement;
}
return self;
}
警告:实例变量访问(通过'self')导致空指针取消引用
问题:为什么我会收到这个警告,以及如何解决这个问题。请在这个问题上给我建议。谢谢
发布于 2012-05-10 10:41:22
尝试将所有初始化代码放入
if (self) {
}
这就是移动[rxmlrRoot itertate...etc ]。加入到if声明中
作为一般规则,所有初始化语法( init方法中的所有内容!)应该在那个if (self)块里。原因是当超类返回零(如果(!self) {.)时,该块外部的代码将运行。如果未调用超级方法(初始化程序只是O中的常规方法),则不希望代码继续执行。
我还被教导在我的自定义类中总是有一个指定的初始化器(这是一个可以调用super的类),我们班上的所有其他初始化程序都会调用这个指定的初始化器。例如。
// Designated initializer
- (id)init
{
self = [super init];
if (self) {
// initialize some stuff
}
// else { something went wrong and super returned nil..
// don't put anything here
return self;
}
// Another initializer
- (id)initWithFoo:(int)foo
{
self = [self init]; // Now i call my designated initializer instead of super
if (self) {
self.foo = foo; // or something
}
}
这样你就可以控制从那一点开始的所有流量。
发布于 2012-05-10 12:08:08
在调用[rxmlRoot iterate:node with:^(RXMLElement *e){ ... }]
中,什么是节点?它不是局部变量,也不是iVar。它是全球性的还是存在于其他地方的?
不管它是什么,检查以确保它已经初始化了。
发布于 2012-05-10 17:37:45
在块内部,通过引用访问实例变量arr
。由于微妙的内存管理规则,访问导致块保留self
。
由于if (self)
是编译器的提示,即self
可能为零,因此块隐式保留self
可能会导致空指针取消引用。
若要修复,请检查是否为零并提前退出:
if (!(self = [super init])) {
return nil;
}
// now it is impossible for self to be nil and cause a null pointer dereference
// when self is implicitly retained by the block
// ...continue initialization
https://stackoverflow.com/questions/10540171
复制