使对象无效的Objective-C方法

Kos*_*s.N 1 iphone objective-c

我在 Objective-C 中编写一个使对象为零的方法时遇到了一些麻烦。下面是一些例子:

@interface testA : NSObject
{
     NSString *a;
}

@property (nonatomic, retain) NSString *a;

+(testA*)initWithA:(NSString *)aString;

-(void)displayA;
-(void)nillify;
@end

@implementation testA
@synthesize a;
+(testA*)initWithA:(NSString *)aString{
    testA *tst=[[testA alloc] init];
    tst.a=aString;
    return [tst autorelease];
}
-(void)displayA{
    NSLog(@"%@",self.a);    
}
-(void)nillify{
    self=nil;
}
- (void)dealloc {
    [a release];
    [super dealloc];
}
@end

int main(int argc, char **argv){
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    testA *test=[testA initWithA:@"some test"];
    [test displayA];
    test=nil;
    //[test nillify];

    NSLog(@"after setting to nil");

    [test displayA];
    [pool release];
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

显然,当我将测试对象设置为 nil 然后对其调用一些方法时什么也没有发生,但是如果我调用 nillify 而不是直接将其设置为 nil , displayA 方法正常工作,就像测试对象仍然存在一样。是否有使 nillify 方法正常运行的解决方法?

非常感谢您的帮助 !

Jas*_*oco 5

你实际上不能做这样的事情,因为将 'self' 设置为 nil 只会在该方法的范围内产生任何影响(在你的情况下,'nilify')。例如,您没有任何实际方法来影响位于堆栈其他部分或堆中随机位置的指针的值。

基本上任何持有对某个对象的引用的代码都负责维护和清除这些引用本身。如果您有一些用例,其中代码的随机部分可能需要引用某种“活动”对象,但您希望这些对象引用消失以响应某些外部事件(可能是用户跟踪系统或其他东西) ,您可以对通知做一些事情,但是跟踪这些“活动”对象的各种模块仍将负责侦听通知并在收到通知时清理引用。

然而,'nilify' 是行不通的。