@synthesize不再自动添加到.m文件中?

时间:2013-03-30 05:05:31

标签: ios objective-c xcode

使用连接器连接按钮,文本字段和标签后,不会自动为标签和文本字段(两个都是出口)生成@synthesize语句,因此当我尝试访问标签或文本字段或其属性时在.m文件中它表示"使用未声明的标识符"但Xcode不应该自动完成吗?我正在关注本教程http://www.youtube.com/watch?v=c3Yd2kCPs5c(大约4:35它显示了自动生成的@synthesize语句,这些语句在xcode中不再发生),这就是我猜测导致此错误的原因。我不应该手动添加这些吗?解决这个问题的最佳方法是什么?

-------.m Fie--------
//
//  ViewController.m
//  AutoConnection
//
//  Created by Administrator on 29/03/13.
//  Copyright (c) 2013 Administrator. All rights reserved.
//

#import "ViewController.h"

@interface ViewController ()

@end

@implementation ViewController

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.
}

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Dispose of any resources that can be recreated.
}

- (IBAction)changeLabel:(id)sender {

    NSString *message = [[NSString alloc] initWithFormat:@"Hello %@", [myTextFeild text]];
    [myLabel setText:message];

}
@end

---------.h file------------
//
//  ViewController.h
//  AutoConnection
//
//  Created by Administrator on 29/03/13.
//  Copyright (c) 2013 Administrator. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
- (IBAction)changeLabel:(id)sender;

@property (weak, nonatomic) IBOutlet UILabel *myLabel;

@property (weak, nonatomic) IBOutlet UITextField *myTextFeild;

@end

4 个答案:

答案 0 :(得分:5)

看到你的密码后,

@property (weak, nonatomic) IBOutlet UILabel *myLabel;
@property (weak, nonatomic) IBOutlet UITextField *myTextFeild;

您将它们作为:

发送给他们
 [myLabel setText:message];

哪个不对。

应为[_myLabel setText:message];

[self.myLabel setText:message];

原因:使用XCode4.4及更高版本运行的编译器,将您的属性自动合成为

@synthesize yourProperty=_yourProperty;

或者,如果您希望使用相同的属性名称

,则可以覆盖此项
@synthesize yourProperty;

答案 1 :(得分:3)

您不再需要使用@synthesize。现在更容易,因为您只需要在属性前添加_字符。实施例

//header
@property (nonatomic) UILabel *l;

//implementation
-(void)viewDidLoad{
_l = [[UILabel alloc] init];
//do stuff
}

您也可以手动添加合成线

答案 2 :(得分:2)

您需要使用self进行自动合成属性使用

- (IBAction)changeLabel:(id)sender {

    NSString *message = [[NSString alloc] initWithFormat:@"Hello %@", [myTextFeild text]];
    [self.myLabel setText:message];

}

如果您有一个名为 myLabel 的属性,编译器将生成代码,就像

一样
@synthesize myLabel=_myLabel;

使用Xcode 4.4和LLVM Compiler 4.0,不再需要@synthesize指令,因为它将默认提供。这意味着在大多数情况下,您现在只需要@property,编译器会为您处理其他所有事情。通常,编译器会自动生成实例变量。

因此,如果您想访问媒体资源,可以使用self.myLabel,例如,您可以使用_myLabel

答案 3 :(得分:2)

@synthesize现在由编译器自动完成。 @property创建了一个getter和setter方法,可以使用点符号(例如self.myLabel)访问它。 这些方法使用变量来存储您正在访问的对象。 Xcode通过在属性名称中添加下划线来生成变量名称。

只使用getter和setter,并且不使用实例变量访问对象(例如_myLabel = foo)。这种风格很糟糕。

这是一个很好的iTunes U课程,涵盖了所有这些:Coding Together: Developing Apps for iPhone and iPad