菜鸟教程小白 发表于 2022-12-12 19:44:59

iPhone 实例变量问题


                                            <p><p>我试图弄清楚将 myString 合成到实例变量 _myString 的目的是什么。</p>

<p>这样做的目的是什么?我倾向于注意到很多人这样做。</p>

<p>我也应该释放实例变量并将实例变量设置为nil,对吗?</p>

<p>ViewController.h</p>

<pre><code>#import &lt;UIKit/UIKit.h&gt;

@interface ViewController : UIViewController
{
    NSString *_myString;
}

@property (nonatomic, retain) NSString *myString;

@end
</code></pre>

<p>ViewController.m</p>

<pre><code>#import &#34;ViewController.h&#34;

@implementation ViewController

@synthesize myString = _myString;

- (void)viewDidLoad
{
    ;

    self.myString = [ initWithFormat:@&#34;Hello&#34;];

    _myString = [ initWithFormat:@&#34;Goodbye&#34;];

    NSLog(@&#34;%@\t%@&#34;, self.myString, _myString);
}

- (void)viewDidUnload
{
    _myString = nil;
    ;
}

- (void)dealloc
{
    ;
    ;
}

@end
</code></pre></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>当您在 objective-c中 @synthesize 对象类型属性时,编译器将为该实例变量生成两个隐藏方法。这样当你引用<code>myObject.myString</code>时,不仅会返回_myString的指针,还会调用生成的<code>- (NSString*) myString</code>方法。同样,如果你给属性赋值: <code>myObject.myString = @"foo";</code> 它将被编译成 <code>;</code>。</code> p>

<p><code>- (NSString*) myString</code> 和 <code>- (void) setMyString:(NSString*) theString</code> 中的内容取决于您在声明属性时指定的关键字。最常见的是<code>assign</code>,它简单地分配你给的指针:</p>

<pre><code>- (void) setMyString:(NSString*) theString
{
   _myString = theString;
}

- (NSString*) myString
{
    return _myString;
}
</code></pre>

<p>这与将 _myString 声明为公共(public)变量没有太大区别,但更明确的说法是可以从外部直接访问此变量。</p>

<p><code>retain</code>依次生成类似的setter方法(getter方法也一样):</p>

<pre><code>- (void) setMyString:(NSString*) theString
{
   ;
   ;
   _myString = theString;
}
</code></pre>

<p>您可以看到,这会处理您传递给属性的对象的内存管理。换句话说,您可以确保该对象在您拥有它之前不会被释放,因此您不必在获得它的所有权时手动<code>retain</code>它。这使得编写管理内存而不会泄漏的代码更加方便。请注意,在 dealloc 中,您仍然必须将 nil 应用于您的属性才能释放它存储的最后一个对象。</p>

<p>另一类属性,当它们的数据不是来自实例变量而是来自其他数据源(如数据库)时。例如,Core Data 的托管对象的自动生成的属性就是这样工作的。</p>

<p>最后,您还可以定义自己的 getter 和 setter。一个好主意,例如围绕一些常用的 <code>NSUserDefaults</code> 设置编写一个属性包装器,这将有助于其访问:</p>

<pre><code>@interface Bar

@property (nonatomic, assign) NSString* foo;

@end

@implementation Bar

- (void) setFoo:(NSString *)theFoo
{
    [ setObject:theFoo
                                              forKey:@&#34;settings.foo&#34;];
}

- (NSString*) foo
{
    return [
      stringForKey:@&#34;settings.foo&#34;];
}

@end

myBar.foo = @&#34;foobar&#34;; // automatically persisted between application runs
</code></pre>

<p>另请阅读:<a href="https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/MemoryMgmt.html" rel="noreferrer noopener nofollow">Advanced memory management</a>和 <a href="http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html" rel="noreferrer noopener nofollow">Declared properties in objective C</a> </p></p>
                                   
                                                <p style="font-size: 20px;">关于iPhone 实例变量问题,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/9771434/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/9771434/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iPhone 实例变量问题