对何时使用自我感到困惑。在目标c

时间:2011-04-01 14:37:59

标签: objective-c memory-management

我有以下课程

@interface DetailMessageViewController : UIViewController<UITextFieldDelegate,MFMessageComposeViewControllerDelegate,UIScrollViewDelegate> {
NSString *messageid;
NSString *messagesenttime;
NSString *sendermobilenumber;

NewMessageAnimation *animation;
NSString *addseconds;
IBOutlet UITextField *replyfield;
IBOutlet UIButton *replybutton;
NSString *tempstring;
UIAlertView *messagesent;
NSTimer *checkifanimationplayed;

}

@property(nonatomic,retain) NSString *messageid;
@property(nonatomic,retain) NSString *messagesenttime;

-(IBAction)replytomessage:(id)sender;
-(NSString *)decryptstring:(NSString *)encryptedstring;
+ (NSData *)decodeBase64WithString:(NSString *)strBase64;
-(void) animateTextField: (UITextField*) textField up: (BOOL) up;
-(IBAction)goawaykeyboard;
-(NSString *)encryptstring:(NSString *)clearstring;
+(NSString *)returndestroytime;
@end

我很困惑何时在我的实现中使用self。(实例变量)。到目前为止,我在实施过程中从未使用过self.ivar。我没有在dealloc方法中释放任何实例变量,我没有在我的viewdidunload方法中将我的ivars设置为nil。我的程序仍然正常。我知道的一件事是 - 当我试图从课外访问或分配ivars时,我使用该属性。

当我编码做什么时 - 我做“构建和分析”。它偶尔会给我一些错误。我确保在任何可能的地方释放所有分配的ivars。最后,我确保我的构建和分析没有任何蓝色错误。应该没关系,还是我应该强制释放dealloc方法中的所有ivars,并在我的viewdidunload方法中将ivars设置为nil。

。有人能指出我正确的内存管理方向。

2 个答案:

答案 0 :(得分:0)

简而言之,使用“构建和分析”作为防止泄漏的唯一方法是行不通的。这是最基本的总结:

使用关键字“self”将调用自动生成的getter和setter。除了帮助进行内存管理之外,属性还可以用于减少代码重复(即,如果您编写自定义setter或getter执行'额外'工作),并且可以使重构代码更容易。

无论您决定使用属性,都必须在dealloc中释放所有保留的数据(否则您将泄露)。属性有助于使“保留”内存易于识别(提示:释放并取消所有“保留”属性)。

有关内存管理的更多信息,请参阅here

答案 1 :(得分:0)

基本上,它非常简单:你使用自我。如果要访问该属性,如果要访问成员变量,则不要使用self。也就是说,通过访问其getter / setter来访问该属性。

因此,要按属性访问messageid,可以调用self.messageid,通过成员变量访问它,只需调用messageid。

现在..说,如果你有自己的构造函数将messageid传递给你的类,你很可能会做类似的事情

-(void) initWithMessageId:(NSString*) aMessageId {
  if (super initWithNibName:.....) {
    self.messageid = aMessageId;
    ...
  }
  return self;
}

如果你只做

会发生什么
if (super initWithNibName:.....) {
    messageid = aMessageId;
    ...
而不是自我?您将访问该成员,因此您必须保留自己以容纳该属性(“messageid = [aMessageId retain];”)。