【问题标题】:Use of [self.labelIBOutlet release] vs [labelIBOutlet release][self.labelIBOutlet release] 与 [labelIBOutlet release] 的使用
【发布时间】:2011-03-06 11:29:39
【问题描述】:

为了成为 iPhone SDK 上的内存公民,我一直在玩一些内存。

但是我仍然很难理解 "self.something" 和只是 "something" 之间的区别。

据我了解,“self.something” 的意思是向全班要“某事”,但我的想法有问题。我们来看例子:

我已经处理过内存释放:

  1. [self.labelIBOUtlet release] ->它崩溃了
  2. [labelIBOUtlet release] -> 没有。

谁能解释一下是什么原因?

谢谢!

编辑:

这是我在头文件中设置的信息:

@interface viewController : UIViewController {
    UILabel * labelIBOutlet ;
}

@property (nonatomic,retain) IBOutlet UILabel * labelIBOutlet ;

【问题讨论】:

    标签: ios memory-management dealloc


    【解决方案1】:

    你必须明白“财产”的含义 使用“点”只是一种更快的方式来调用“特殊方法”,这些方法是为“设置”和“获取”变量属性而创建的。

    例如,您可以拥有自己的使用子视图的类/UIView:

    在 myView.h 中

    @interface myView : UIView  {
        UIWebView *webView;
    }
    

    如果你这样做,你就没有“财产”,而只是一个对象...... 因此,在您的 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];
    

    【讨论】:

    • 谢谢meronix,我看不出你的回答与我的问题有什么关系。我的意思是,这是对使用属性和综合的 getter 和 setter 的一个很好的描述。但是还是不明白为什么使用 [self.labelIBOutlet release] 会导致应用崩溃。如果我没记错的话,在那种释放情况下,我没有使用 getter 或 setter!
    • @LeoUKSP:嗯,是的,这就是重点:你正在这样做......“self.labelIBOutlet”正是对 labelIBOutlet 的 getter 方法的调用
    • @LeoUKSP:试试这个,它可能会帮助你理解:添加自己的getter方法,添加这个:-(id)labelIBOutlet{return labelIBOutlet;} ...现在再次尝试调用[self.labelIBOutlet 发布]; ...不使用@property 和@synthetize,我的意思是...它不应该再崩溃了...
    • 嗯,我理解有问题,我试过了,还是crash。
    • 如果您在dealloc 中调用它,它会在[super dealloc] 之前发生吗?
    【解决方案2】:

    你在实现文件中@synthesize labelIBOutlet 了吗?

    【讨论】:

      【解决方案3】:

      如果您的对象中没有 labelIBOUtlet 声明,它将调用 self.labelIBOUtlet,因为它不存在。 self == 在头文件中声明的对象中

      希望它说清楚

      【讨论】:

      • 您好,Csabi,感谢您的遮阳篷。我不知道我是否理解你的回答。据此,它不应该崩溃!编辑:对不起,我没有说我在头文件上正确设置了标签。
      猜你喜欢
      • 2018-10-22
      • 1970-01-01
      • 2017-03-08
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 2018-09-26
      • 2016-04-04
      • 1970-01-01
      相关资源
      最近更新 更多