0

如果我创建 NSString 类型的属性而不为其分配空间并为其分配一些值,则它可以工作。当我为 UITextField 做同样的事情时,它不会......?我正在以编程方式创建一个文本字段....任何帮助表示赞赏。

编辑:

我在 SecondViewController 的 .h 中创建了两个属性...

@property (nonatomic,retain) NSString *text;
@property (nonatomic, retain) UITextField *textField;

现在,如果我创建一个新对象 secondViewController 并说这样做...

   secondViewController.text=@"Second View Controller";

即使我没有为它分配内存,这个值也会被保留......

如果我尝试对文本字段对象做同样的事情,除非我为它分配内存,否则不会发生这种情况。

这是我的 SecondViewController ...

//
//  SecondViewController.m
//  Tester
//
//  Created by Ankit on 4/16/12.
//  Copyright (c) 2012 __MyCompanyName__. All rights reserved.
//

#import "SecondViewController.h"

@implementation SecondViewController
@synthesize  text,textField;

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        // Custom initialization
    }
    return self;
}

- (void)didReceiveMemoryWarning
{
    // Releases the view if it doesn't have a superview.
    [super didReceiveMemoryWarning];

    // Release any cached data, images, etc that aren't in use.
}

#pragma mark - View lifecycle

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSLog(@"The text is %@",text);

//   textField = [[UITextField alloc] initWithFrame:CGRectMake(10, 200, 300, 40)]; (if I `uncomment this than only this textField is visible)`
    textField.frame=CGRectMake(10, 200, 300, 40);
    textField.borderStyle = UITextBorderStyleRoundedRect;
    textField.font = [UIFont systemFontOfSize:15];
    textField.placeholder = @"enter text";
    textField.autocorrectionType = UITextAutocorrectionTypeNo;
    textField.keyboardType = UIKeyboardTypeDefault;
    textField.returnKeyType = UIReturnKeyDone;
    textField.clearButtonMode = UITextFieldViewModeWhileEditing;
    textField.contentVerticalAlignment = UIControlContentVerticalAlignmentCenter;    
    [self.view addSubview:textField];

//    textfield=[[UITextField alloc] init];
//    textfield.frame=CGRectMake(10,10,60, 30);
//    [self.view addSubview:textfield];
    // Do any additional setup after loading the view from its nib.
}

- (void)viewDidUnload
{
    [super viewDidUnload];
    self.text=nil;
    self.textField=nil;
    NSLog(@"viewDidUnLoad");
    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}
-(void)dealloc{
    NSLog(@"dealloc");
    [text release];
    [textField release];
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    // Return YES for supported orientations
    return (interfaceOrientation == UIInterfaceOrientationPortrait);
}

@end
4

3 回答 3

1

属性只是对对象的引用,“空间”必须来自其他地方。与 NSString 唯一真正的区别是空间通常是文字的形式,因此您不会直接看到分配。@"Hello" 是一个可以引用的真实对象,但在其他情况下,您使用与 [[UITextField alloc] init...] 结构相同的 [[NSString alloc] init...] 结构。

于 2012-04-16T12:47:13.650 回答
1

NSString是一个特殊的对象。不像UITextField它是建立在许多其他东西上的,@你看到的字符是对编译器的一个特殊提示,它是一个NSString. 换句话说,编译器正在为您执行 alloc 和 init。它所做的差不多[[NSString alloc] initWithCString:"your string"]。该代码更像是一种简写方式,可以节省您的时间。

String实际上不是像int. 编译器将其视为数组或内存缓冲区。但人们往往有将其用作原始数据类型的习惯。因此,在许多编程语言中都发生了类似的特殊处理。

UITextField与数据类型没有任何相似之处。它是一个物体,它是重量级的。除了它是一个对象之外,编译器对其性质知之甚少。以这种方式优化语法并没有多大意义(我的意思是他们可以)。所以它以你看到的行为结束。

于 2012-04-16T12:56:09.943 回答
0

NSString 有一个内置的便利宏来做NSString *bob = @"bob";

目前,没有其他类有这个确切的符号(数组字典和集合很快就会得到它)

要使用 UITextField 你必须正确地做

UITextField *tf = [[UITextField alloc]init]

然后打电话tf.text = @"";

编辑:这=@""只是使用 alloc 和 init 创建新字符串的包装器。它只是隐藏它:)

于 2012-04-16T12:50:41.640 回答