iPhone Objective-C基本示例问题(关于属性)

时间:2009-12-21 03:10:25

标签: iphone objective-c xcode properties

抱歉,我无法提供更具描述性的标题。我的问题(在查看下面的代码之后)是 statusText 是什么。它是IBOutlet还是UILabel? “@property(保留,非原子)UILabel * statusText”如何工作?该语句是否意味着statusText是属性???

感谢您的回答。如果有任何问题,请随时发表评论。

Button_FunViewController.h

@interface Button_Fun2ViewController : UIViewController {
    IBOutlet UILabel *statusText;
}
@property (retain,nonatomic) UILabel *statusText;
- (IBAction)buttonPressed: (id)sender;

Button_FunViewController.m

@synthesize statusText;

- (IBAction)buttonPressed: (id)sender {
    NSString *title = [sender titleForState:UIControlStateNormal];
    NSString *newText = [[NSString alloc] initWithFormat:@"%@ button was pressed.", title];
    statusText.text = newText;
    [newText.release];  
}

5 个答案:

答案 0 :(得分:2)

IBOutlet评估为空,只是提示Interface Builder它是一个“连接”。

是的,statusText是一个属性。属性需要三个语句(在非“现代运行时”系统上) - ivar声明,@property语句和synthesize语句。

答案 1 :(得分:2)

statusTextUILabel*类型的实例变量。 IBOutlet关键字只是使Interface Builder可以使用该实例变量。

@property声明给定属性的访问器和/或mutator方法。它等同于声明-statusLabel-setStatusLabel:方法。

您可以使用@synthesize自动实施这些-statusLabel-setStatusLabel:方法。 nonatomicretain关键字定义了这些自动生成的方法的行为。

或者,您可以自己实施-statusLabel-setStatusLabel:方法。

答案 2 :(得分:2)

  • 什么是statusText

statusText是代码示例中的UILabel

  • IBOutlet还是UILabel

两个

UILabel是一种类型(指向您在GUI中使用的UILabel组件的指针)

IBOutlet标记Interface Builder应用程序的变量,因此它知道将其显示为Outlet。在编译期间,编译出IBOutlet,它在NSNibDeclarations.h中定义为:

#define IBOutlet

  • @property (retain,nonatomic) UILabel *statusText如何运作?

您可以手动为变量创建访问器(getter / setter),无需使用属性。您可以拥有UILabel *statusText并手动实施您的getter / setter。

您可以通过将变量定义为@property来使编译器声明访问器,然后使用@synthesize.m文件中创建访问器,或者再次自己声明访问器(您可以覆盖)将生成的默认访问者)

您可以拥有readwritereadonly属性 - 这意味着setter和getter都会生成或只有getter。

您可以使用copyretainassign作为setter(请参阅有关树选项的内存管理的更多信息,复制/保留/分配)

还有一些其他选项,如非原子/原子,与访问前生成互斥锁和锁定变量等有关(请参阅更多about properties

例如,如果你有变量

NSString * string;

将其定义为readwrite属性然后合成,让编译器为您生成:

@property (copy, readwrite) NSString * string

然后使用

@synthesize string;

生成如下内容:

- (NSString *) string
{
    return string;
}

- (void)setString:(NSString *)str
{
    NSString * copy = [str copy];
    [string release];
    string = copy;
}
  • 这句话是否意味着这一点    statusText是属性???

是的,您将其定义为属性,如上所述。

这里涉及几个概念。 变量的定义,将其定义为Interface Builder的IBOutlet,将变量声明为属性,以便编译器为您生成getter / setter,定义getter / setter的类型,如访问方法,内存管理和锁定。

我希望这可以解释您的问题,如果您按照链接进行操作,您会发现Apple的解释,我相信这些解释非常清楚如何使用属性。

抱歉可怕的格式化......

答案 3 :(得分:0)

如果您将IBOutlet放在那里,它将允许您在界面构建器中链接该项目。

完成IBOutlet设置后,您可以打开该类的笔尖,然后选择文件所有者,然后转到检查器并将链接从“连接”选项卡拖到该对象。

然后,您可以在类的代码中对对象进行更改,它将更改链接的对象。因此,一旦将“statusText”链接到特定的UILabel,您就可以在类的代码中使用statusText.text = @"new text"来修改项目,例如。

此外,IBAction允许您以相同的方式建立链接。您可以将连接从控件的事件拖到文件所有者,然后选择该类中具有IBAction作为返回值的任何方法。

答案 4 :(得分:0)

在您的示例中实际上有两个statusText“事物”。有一个类型为UILabel的statusText对象,statusText创建了一个@synthesize函数。当您在方法中使用statusText时,您正在攻击对象,而不是函数。使用self.statusText来使用属性/函数。