2017-09-12 12 views
1

我有接受指针的指针param的方法:现在目标C指向指针 - 如何传递零相较于未初始化的变量集区分为nil

+(void)someMethod:(NSString*_Nullable*_Nullable)parsed; 

,如果我调用此方法,并通过“无“作为参数,然后我做里面的解除引用,如:

*parsed = soemthing; 

我得到崩溃坏的访问。现在的问题是,如何构建条件来区分通过“无”与传递不initilized变量,如:

NSString* s; // this is technically nil too, but dereference works and doesn't crash 
[someObj someMethod:&s]; 

,以防止在第一种情况中提到的崩溃。

回答

2

该解决方案相对简单,您不应该传递一个未初始化的变量。考虑这样做:

NSString *s = nil; 
[someObj someMethod:&s]; 

注意,你已经宣布&小号的someMethod需要一个NSString的**。通过执行& s解析将始终被定义,因为变量显然存储在内存中的某处。它存储在* parsed的值将被初始化为零。然后,您应该可以执行如下操作:

+(void)someMethod:(NSString* _Nullable *_Nullable)parsed { 
    if(NULL != parsed) { 
     if(nil == *parsed) { 
      *parsed = @"Our variable *s will now be set!"; 
     } 
    } 
} 

享受!

+1

嗨,谢谢你的回复。现在我看到解决方案可能比我想象的更容易。如果(解析)条件应该足以检查问题,因为解析的是该指针在内存中的地址,并且在将指针(偶数)传递给未初始化变量的情况下地址不为空。 – luky

+1

严格地说,第一个测试应该是'NULL'而不是'nil'。后者仅适用于对象类型。第二个指针本身不是一个对象。 –

+0

@JoshCaswell谢谢,我更新了代码以反映这一点。尽管我还没有看到一个平台,其中NULL和nil都不是都用数值0表示,但您应该将nil用于对象指针,将NULL用于内存指针,这是正确的。 – ekscrypto