为了成为iPhone SDK上的好记忆,我一直在玩内存。
但是我仍然很难理解“self.something”与“某事”之间的区别。
据我所知,“self.something”意味着向班级询问“某事”,但我的想法有些不对劲。我们来看看这个例子:
我使用了记忆释放:
[self.labelIBOUtlet release]
- >它崩溃了 [labelIBOUtlet release]
- >它没有。 有谁能解释一下我的原因是什么?
谢谢!
编辑:
这是我在头文件中设置的信息:
@interface viewController : UIViewController {
UILabel * labelIBOutlet ;
}
@property (nonatomic,retain) IBOutlet UILabel * labelIBOutlet ;
答案 0 :(得分:2)
你必须明白“财产”的含义 使用“dot”只是一种更快的方法来调用“set”和“get”变量属性创建的“特殊方法”。
例如,您可以拥有自己的类/ UIView,它使用subView:
myView.h中的
@interface myView : UIView {
UIWebView *webView;
}
如果你这样做,你就没有“财产”,只是一个ojbect ...... 所以在你的myView.m中你试着像这样使用“点”:
NSLog(@"%i", self.webView.frame.size.width);
然后你得到一个错误,你不能这样做,xCode说: 错误:访问未知的'webView'getter方法
这只是意味着“webView”方法不存在...... '当你打电话给“self.webView”时,你只需要调用一个名为“webView”的方法...... 此方法只返回指向您的值的指针。 当你打电话时:
self.webView=someValue;
你只是调用方法“setWebView”,这个方法只是用someValue设置你的对象......
但是......那两种看不见的方法来自哪里?
如果你告诉它使用webView作为属性,它们是由xCode自己创建的...... 在我们的示例中,添加一些行:
myView.h中的
@interface myView : UIView {
UIWebView *webView;
}
@property (nonatomic, retain) UIWebView *webView;
myView.m中的
@implementation myView
@synthesize webView;
// ...
这样做xCode会为你添加2个方法“webView”和“setWebView”, 现在你可以打电话:
NSLog(@"%i", self.webView.frame.size.width);
没有错误......
你可以把值(正确的格式,在这种情况下是一个指向现有UIWebView的指针) 只是打电话:
self.webView = aUIWebView;
并记得释放它,'你使用“保留”:
@property (nonatomic, retain) UIWebView *webView;
将其发布:
[webView release];
答案 1 :(得分:0)
如果你的对象中没有labelIBOUtlet声明它将调用self.labelIBOUtlet,因为它不存在。 self ==位于头文件
中声明的对象中希望它能说清楚
答案 2 :(得分:0)
你是否在实现文件中@synthesize labelIBOutlet?