我一直在youtube上观看Xcode教程并从在线示例中学习,但无法找到使用的一致性。
我从本网站的文章中了解到,必须发布使用Alloc / Init,Copy或New创建的任何对象。
但: - 所有对象都必须使用@ property / @ synthesize吗?无论他们是否是IBOutlets? - (id)发送者是否必须与.h和.m文件中的所有方法(IBAction)和(void)一起使用?
非常感谢!
答案 0 :(得分:3)
属性只是ivars
的设置者和获取者。
@interface MyVC : NSObject {
UIButton *myPropertyButton;
UIButton *myIvarbutton;
}
@property (nonatomic, retain) UIButton *myPropertyButton;
// No @property for myIvarbutton
@end
@implementation MyVC
@synthesize myPropertyButton;
// no @synthesize for myIvarbutton
- (void)someMethod {
NSLog(@"%@", [self.myPropertyButton description]);
NSLog(@"%@", [myIvarButton description]);
}
@end
@synthesize
为此创建方法类似:
- (UIButton *)myPropertyButton {
return [[myPropertyButton copy] autorelease];
}
- (void)setMyPropertyButton:(UIButton *)value {
[value retain];
[myPropertyButton release];
myPropertyButton = value;
}
properties
可以通过self.someProperty
或classInstance.someProperty
访问(可以调用self
或classInstance
的setter / getter )。
IBAction
和IBOutlet
是特定于xcode的指令,允许您从Interface Builder中的对象建立与方法/属性/ ivar的连接。
您不必在动作处理程序中包含:(id)sender
,但如果您有多个按钮连接到同一方法,则可能需要这样做。然后,您可以区分调用该方法的按钮:
- (void)someAction:(id)sender {
if (![sender isKindOfClass:[UIButton class]]) return;
if ((UIButton *)sender == myButtonOne) {
// do stuff
} else if ((UIButton *)sender == myButtonTwo) {
// do other stuff
}
}
你应该知道,Apple保留所有变量名称,以自己的前导下划线开头。
答案 1 :(得分:0)
@ property / @ synthesize。这意味着该属性将动态创建setter&吸气剂,与记忆管理无关。
(id)sender是一个采用泛型参数的方法(在大多数情况下是“发送”消息的按钮),如果情况允许,可以使其更具体。例如,没有理由为UIButton的IBAction方法不能-(IBAction)myMethod:(UIButton *)button;
,但是如果UIButton以外的任何其他方法调用该方法,它将导致问题。不,你当然可以使用void
个方法来获取任意数量的参数(包括无参数)。
而且,与往常一样,非ARC项目的一个好的经验法则是:
每次在对象上调用
release
或alloc
时,请致电retain
。