我正试图了解弧工作的方式,据我所知,我应该在这里做错事。这是我使用的代码:

interface:

@interface ViewController : UIViewController{

}

@property (strong, nonatomic) NSString * myString ; 
@property (weak, nonatomic) NSString * myPointer ;
.

实现:

 - (void)viewDidLoad{

     [super viewDidLoad];
     self.myString = @"Hello world!" ; // myString is strong
     self.myPointer = self.myString ; // myPointer var is weak

     [self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];    
     [self performSelector:@selector(printValues) withObject:nil afterDelay:2];    
}

 - (void) makeNilMyValue{
     self.myString = nil ; 
}

 - (void) printValues{
     NSLog(@"myString: %@", self.myString) ;
     NSLog(@"myPointer: %@", self.myPointer) ; 
 }
.

执行此操作后,我得到:

2012-02-26 11:40:41.652 test1[933:207] myString: (null)

2012-02-26 11:40:41.653 test1[933:207] myPointer: Hello world!
.

如果我错了,由于mypointer很弱,它不应该保留对象的内容。所以,它应该显示零而不是“你好世界!”。

我做错了什么?

在caleb的答案之后,我创建了另一个弱指针,请参见下面的代码:

- (void)viewDidLoad{
    [super viewDidLoad];
    self.myString = @"Hello world!" ; // myString is strong
    self.myPointer = self.myString ; // myPointer var is weak
    self.myPointer2 = self.myString ; // myPointer2 var is weak

    [self performSelector:@selector(makeNilMyValue) withObject:nil afterDelay:1];    
    [self performSelector:@selector(printValues) withObject:nil afterDelay:2];    
}

- (void) makeNilMyValue{
    self.myPointer2 = @"value changed!" ;
    self.myString = nil ;

}

- (void) printValues{
    NSLog(@"myString: %@", self.myString) ;
    NSLog(@"myPointer: %@", self.myPointer) ;
}
.

这一点是我仍然得到了相同的答案我曾经拥有:

2012-02-26 12:08:13.426 test1[1333:207] myString: (null)
2012-02-26 12:08:13.427 test1[1333:207] myPointer: Hello world!
.

有帮助吗?

解决方案

作为caleb指出,使用常量nsstring为此例子是不是一个好主意。

在源代码中创建字符串对象的最简单方法是使用目标-c @“...”构造:

nsstring * temp= @“/ tmp / scratch”;请注意,在创建字符串时 常量以这种方式,您应该避免使用任何7位的东西 ASCII字符。此类对象是在编译时创建的并且存在 在整个程序的执行中。编译器制作此类对象 常量是独特的,每个模块的基础,他们从未被解除过, 虽然您可以在做任何其他对象时保留并释放它们。你 也可以将消息直接发送给字符串常数,您可以 其他字符串:

BOOL相同= [@“比较”arequaltostring:mystring];

文档解释说恒定字符串永远不会消失。

尝试使用别的东西进行实验。我尝试了nsobject,它产生了预期的结果。

界面:

@interface ViewController : UIViewController

@property (strong, nonatomic) NSObject * myString; 
@property (weak, nonatomic) NSObject * myPointer;

@end
.

实现:

@implementation ViewController

@synthesize myString = _myString;
@synthesize myPointer = _myPointer;

- (void)viewDidLoad{

    [super viewDidLoad];

    self.myString = [[NSObject alloc] init];
    self.myPointer = self.myString;
    self.myString = nil; 
    NSLog(@"myString: %@", self.myString);
    NSLog(@"myPointer: %@", self.myPointer);
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
}

@end
.

弱指针被设置为nil,当文档中解释的内存没有强子指针时 - Apple Developer llvm

__弱指定不保留引用对象的引用。当没有强有力时,弱参考被设定为NIL 引用对象。

其他提示

所以,它应该显示nil而不是“你好世界!”。

恒定字符串永远不会被解除分配,所以你的“@”你好世界!“永远不会消失。这就是为什么你的弱引用永远不会被设置为nil。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top