1

タイトルに書かれているように、私はにプロパティを持っていますUITextField。これをに追加UITextFieldUIViewます。

私が強いポインタを持っている場合、が表示されUITextFieldます、

ポインタが弱いと、が表示されUITextFieldません。

ポインタが弱いとどうなりますか?私は同じことをしました、UIButtonそしてそれからそれは実際に現れます(強いポインターと弱いポインターで)。

ここにいくつかのコードがあります:

CreateCategoryView.h

@interface CreateCategoryView : UIView 

@property (weak, nonatomic) UITextField *nameTextField;

@end

CreateCategoryView.m

@implementation CreateCategoryView

- (id)initWithFrame:(CGRect)frame andParent {
    self = [super initWithFrame:frame];
    if (self) {
        self.nameTextField = [[UITextField alloc] initWithFrame:CGRectMake(5, 30, 310, 25)];
        self.nameTextField.borderStyle = UITextBorderStyleRoundedRect;
        self.nameTextField.textColor = [UIColor blackColor];
        self.nameTextField.backgroundColor = [UIColor whiteColor];
        [self addSubview:self.nameTextField];
    }
    return self;
}

@end
4

4 に答える 4

5

ローカル変数(デフォルトでは強力)を使用してテキストフィールドを作成し、それをプロパティに割り当てる必要があります。追加するビューは強力な参照を保持するため、テキストフィールドへの強力な参照を使用する必要はありません。

- (id)initWithFrame:(CGRect)frame  {
    self = [super initWithFrame:frame];
    if (self) {
        UITextField *tf = [[UITextField alloc] initWithFrame:CGRectMake(5, 30, 310, 25)];
        tf.borderStyle = UITextBorderStyleRoundedRect;
        tf.textColor = [UIColor blackColor];
        tf.backgroundColor = [UIColor whiteColor];
        _nameTextField = tf;
        [self addSubview:_nameTextField];
    }
    return self;
}
于 2012-12-15T22:23:39.087 に答える
3

受け入れられた答えは間違っています。

問題は、ビューが作成された直後に解放されることです。これは、次のようにすることで確認できます

__weak UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];

これでコンパイラは文句を言うでしょう

warning: assigning retained object to weak variable; object will be released after assignment

あなたがする必要があるのは一時strong変数を持っていることです、それは@rdelmarが指摘するようにローカル変数はデフォルトであります

それで

UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];

と同等になります

__strong UIView *view = [[UIView alloc] initWithFrame:CGRectMake(0, 0, 10, 10)];

これにより、ビューの呼び出しによって所有されるのに十分な時間、ビューが存続します。addSubview

于 2012-12-15T22:45:34.840 に答える
0

Appleのドキュメントにはこれに関する例があります

弱い変数は、特に次のようなコードでは、混乱の原因となる可能性があります。

NSObject * __weak someObject = [[NSObject alloc] init];

この例では、新しく割り当てられたオブジェクトには強い参照がないため、すぐに割り当てが解除され、someObjectがnilに設定されます。

于 2014-04-19T07:14:50.077 に答える
-1

オブジェクトは弱いポインタであるため保持されないため、テキストフィールドは初期化された直後に解放されます。弱いプロパティを使用して強いオブジェクトをポイントし、オブジェクトが保持されたままになるようにします。

于 2012-12-15T21:43:04.320 に答える