1

Objective-C で弱いプロパティがどのように機能するかを知りたいです。この例では、"myClass" の弱いプロパティ "myString" の値は、NSLog で出力した場合にのみ保持されます。何故ですか?

#import <Foundation/Foundation.h>
#include <stdio.h>

@interface myClass : NSObject
@property (nonatomic, weak)NSString *myString;
- (void)readString;
@end

@implementation myClass
@synthesize myString;
- (void)readString
{
    const int MAXBUFFER = 80;
    char buffer[MAXBUFFER+1];
    NSLog(@"Input string:");
    fgets(buffer, MAXBUFFER, stdin);
    NSString *tempString = [[NSString alloc] initWithUTF8String:buffer];
    myString = tempString;
    NSLog(@"myString: %@", myString);  // Why does this line make all the difference?
}
@end

int main(int argc, const char * argv[])
{

    @autoreleasepool
    {
        myClass *myInstance = [[myClass alloc] init];
        [myInstance readString];
        NSLog(@"myInstance.myString: %@", myInstance.myString);
    }
    return 0;
}

readString メソッドの NSLog 行がコメント アウトされている場合、myInstance.myString は "(null)" になります。どうして??

4

1 に答える 1

1

Appleから:

weak宛先オブジェクトに対して弱い(所有していない)関係があることを指定します。宛先オブジェクトの割り当てが解除されると、プロパティ値は自動的にnilに設定されます。

したがって、基本的に、アークが[readString]にコードを挿入するとき、彼は次のことを行います。

NSString *tempString = [[NSString alloc] initWithUTF8String:buffer];
    myString = tempString;
// + arc [tempString release]

したがって、tempStringはメソッドの外部に存在しなくなります。これは、tempStringを保持するものがないためです。

しかし、myStringを使用して[readString]内にNSlogを追加すると、NSLogはポインターへの参照を保持します(正確な方法はわかりません)が、実際にはログに記録するためです。

于 2012-10-09T13:21:49.953 に答える