相关疑难解决方法(0)

Objective-C中的属性和实例变量

我对Objective-C中的属性和实例变量感到困惑.

我在Aaron Hillegass的"Mac OS X的可可编程"中走了一半,一切都是合乎逻辑的.你会声明一个这样的类:

@class Something;

@interface MyClass : NSObject {
    NSString *name;
    NSArray *items;

    Something *something;

    IBOutlet NSTextField *myTextField;
}

@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSArray *items;
Run Code Online (Sandbox Code Playgroud)
  • 由于其他对象需要操作我们的实例nameitems实例变量,我们使用@property/ @synthesize为它们生成访问器/ 更改器.在我们的类中,我们不使用访问器/ mutator - 我们只是直接与实例变量交互.

  • something 只是我们将在我们的类中使用的实例变量,并且由于没有其他人需要使用它,我们不会为它创建一对访问器和变换器.

  • 我们需要在UI中与文本字段进行交互,因此我们声明了IBOutlet它,连接它,我们就完成了.

都很合乎逻辑.

然而,在iPhone世界中,事情似乎有所不同.人们声明属性,为每一个实例变量,用于声明属性IBOutlets,并使用存取/存取器与实例变量相互作用的类别(例如,他们会写[self setName:@"Test"],而不是name = @"Test").

为什么?到底是怎么回事?这些差异是否与iPhone有关?为所有实例变量声明属性,为IBOutlets自己的类声明属性以及在自己的类中使用访问器/变换器有什么好处?

cocoa cocoa-touch properties objective-c instance-variables

55
推荐指数
2
解决办法
2万
查看次数

如果我不保留IBOutlet会怎样?

如果我这样做:

@interface RegisterController : UIViewController <UITextFieldDelegate>
{
    IBOutlet UITextField *usernameField;
}
Run Code Online (Sandbox Code Playgroud)

而不是这个:

@interface RegisterController : UIViewController <UITextFieldDelegate>
{
    UITextField *usernameField;
}
@property (nonatomic, retain) IBOutlet UITextField *usernameField;
Run Code Online (Sandbox Code Playgroud)

会发生什么坏事吗?我知道在第二种情况下,该字段被保留,但是由于笔尖拥有该字段,这是否会有所不同?没有保留,这个领域会消失吗?在什么情况下?第一种情况下的代码工作,想知道这是否是内存管理方面的问题.

iphone retain

39
推荐指数
3
解决办法
1万
查看次数

IBOutlet是否意味着__weak?

刚开始使用ARC.在ARC之前,我只是简单地宣布我的网点为例:IBOutlet UIButton *button;所以我不保留它或任何东西.使用ARC,不指定弱或强意味着强大.

所以,如果我在ARC(即IBOutlet UIButton *button;)下做同样的事情,这是否意味着按钮是一个强大的参考?或者我是否必须将其定义为弱?

简而言之,IBOutlet是否意味着 __weak?

cocoa-touch objective-c ios automatic-ref-counting

6
推荐指数
1
解决办法
2254
查看次数