我有以下课程
@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。
。有人能指出我正确的内存管理方向。
答案 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];”)。