何时正确使用@ property / @ synthesize,(id)sender和release

时间:2011-10-31 20:53:01

标签: xcode object

我一直在youtube上观看Xcode教程并从在线示例中学习,但无法找到使用的一致性。

我从本网站的文章中了解到,必须发布使用Alloc / Init,Copy或New创建的任何对象。

但: - 所有对象都必须使用@ property / @ synthesize吗?无论他们是否是IBOutlets? - (id)发送者是否必须与.h和.m文件中的所有方法(IBAction)和(void)一起使用?

非常感谢!

2 个答案:

答案 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.somePropertyclassInstance.someProperty访问(可以调用selfclassInstance的setter / getter )。


IBActionIBOutlet是特定于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项目的一个好的经验法则是:

  

每次在对象上调用releasealloc时,请致电retain