2009-12-21 69 views
1

对不起,我不能给一个更具描述性的标题。我的问题(看下面的代码后)是什么statusText是。它是IBOutlet还是UILabel? “@property(保留,非原子)UILabel * statusText”如何工作?这个声明是否意味着statusText是一个属性?iPhone Objective-C基本示例问题(关于属性)

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

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]; 
} 
+0

基于前2个答案,我猜这意味着statusText是一个UILabel不属性。那么为什么“@属性(保留,非原子)UILabel * statusText”,为什么没有这个声明使它成为一个属性? – Devoted 2009-12-21 03:23:36

+0

为什么一个物体不能成为一个物体?也就是说,为什么不能将statusText作为UILabel类型的对象,仍然是一个属性? – refulgentis 2009-12-21 03:25:32

+0

和@property是*必要*使其成为一个属性,但不*充分*。 – refulgentis 2009-12-21 03:26:04

回答

2

IBOutlet中的计算结果不了了之,它只是界面生成器,这是一个 '连接' 的提示。

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

0

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

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

这让我们改变你的类的代码中的对象,它会改变链接的对象。因此,例如,一旦将“statusText”链接到特定的UILabel,您可以在您的课程代码中使用statusText.text = @"new text"来修改该项目。

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

2

statusTextUILabel*类型的实例变量。 IBOutlet关键字只是简单地将该实例变量提供给Interface Builder。

@property声明给定属性的存取器和/或增变器方法。这相当于宣布了-statusLabel-setStatusLabel:方法。

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

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

+0

是的,但“@property”声明的目的是什么?另外,我该如何使用该物业? – Devoted 2009-12-21 03:55:11

+2

其目的是声明您的课程的公开访问属性。通常,属性对应于私有实例变量,但他们不必。 – Darren 2009-12-21 03:58:04

+0

但在这个例子中,它没有做任何事我猜。因为我删除了“@属性”和“@synthesize”,它仍然有效。 – Devoted 2009-12-21 04:00:24

0

在你的例子中实际上有两个statusText“东西”。有一个statusText类型的UILabel对象,并且有statusText函数由@synthesize创建。当您在方法中使用statusText时,您正在接触对象,而不是函数。使用self.statusText来使用属性/功能。

+0

从技术上讲,这是一种方法,而不是一种功能。 /狡辩 – 2009-12-21 09:23:08

2
  • 什么是statusText

statusTextUILabel在你的代码示例

  • 它是一个IBOutletUILabel

两者。

UILabel是一种类型的(一个指针到在GUI使用UILabel成分)

IBOutlet标记变量用于接口Builder应用,以便它知道它显示为出口。在编译期间IBOutlet中被编出来,它在NSNibDeclarations.h被定义为:

#define IBOutlet

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

您可以手工为变量创建访问器(getters/setters),不需要使用属性。你可以只有UILabel *statusText并亲自实施你的getter/setter。

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

你可以有readwritereadonly属性 - 这意味着setter和getter都被生成或者只有getter。

您可以使用copyretainassign进行setter(看更多的内存管理有关树optons复制/保留/分配)

还有一些其他的选项,如非原子/原子具有与产生互斥做并获得前锁变量等(详见about properties

例如,如果你有可变

NSString * string;

将其定义为读写属性,然后合成你的编译器为你:

@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/setters,定义getter/setter类型,如访问方法,内存管理和锁定。

我希望这可以解释你的问题,如果你按照链接,你会发现苹果的解释,我相信这是非常清楚如何使用属性。

对不起,可怕的格式...