我对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)
由于其他对象需要操作我们的实例name和items实例变量,我们使用@property/ @synthesize为它们生成访问器/ 更改器.在我们的类中,我们不使用访问器/ mutator - 我们只是直接与实例变量交互.
something 只是我们将在我们的类中使用的实例变量,并且由于没有其他人需要使用它,我们不会为它创建一对访问器和变换器.
我们需要在UI中与文本字段进行交互,因此我们声明了IBOutlet它,连接它,我们就完成了.
都很合乎逻辑.
然而,在iPhone世界中,事情似乎有所不同.人们声明属性,为每一个实例变量,用于声明属性IBOutlets,并使用存取/存取器与实例变量相互作用中的类别(例如,他们会写[self setName:@"Test"],而不是name = @"Test").
为什么?到底是怎么回事?这些差异是否与iPhone有关?为所有实例变量声明属性,为IBOutlets自己的类声明属性以及在自己的类中使用访问器/变换器有什么好处?
在大多数示例中,我看到以下IBOutlets设置:
(Example A)
FooController.h:
@interface FooController : UIViewController {
UILabel *fooLabel;
}
@property (nonatomic, retain) IBOutlet UILabel *fooLabel;
@end
FooController.m:
@implementation FooController
@synthesize fooLabel;
@end
Run Code Online (Sandbox Code Playgroud)
但这也很好(注意:没有属性也没有合成):
(Example B)
FooController.h:
@interface FooController : UIViewController {
IBOutlet UILabel *fooLabel;
}
@end
FooController.m:
@implementation FooController
@end
Run Code Online (Sandbox Code Playgroud)
如例B中那样定义IBOutlets是否有任何缺点?像内存泄漏?似乎工作正常,我更喜欢不将IBOutlets公开为公共属性,因为它们不是这样使用的,它们仅用于控制器实现.在没有真正需要的情况下将它定义在三个地方并不会让我觉得非常干(不要重复自己).
我不明白loadView:函数的机制(这个函数在UIView中).
我创建了一个项目如下:
UIView子类UIViewController没有xib 的子类.loadView:我在第三步中创建的类的函数中,我将UIView对象(在我在第二步中创建的类)指定为对象的视图变量UIViewController(在第三步中).如果我省略了最后一步,并将语句NSLog(@"test LoadView");放在loadView:函数中,那么当项目运行时,语句NSLog(@"test LoadView");会被连续调用,导致运行溢出.
请解释一下!谢谢!