菜鸟教程小白 发表于 2022-12-13 17:10:26

iphone - 类工作不正确。如何让它变得更好?


                                            <p><p>我已经写了课,想给你看...</p>

<p>我认为这门课写的不正确,这就是为什么我的申请中有韭菜。首先, <code>delloc</code> 从不调用。我可以在这门课中进行哪些更改以使其变得更好,请帮助。</p>

<p><strong>Articles.h</strong></p>

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

@interface Article : NSObject {
    BOOL favorite;
    NSMutableString * title;
    NSMutableString * summary;
    NSMutableString * mainLink;
    NSMutableString * pubDate;
    NSMutableString * author;
    NSMutableString * imageLink;
}

@property (nonatomic, assign) BOOL favorite;
@property (nonatomic, retain) NSMutableString * title;
@property (nonatomic, retain) NSMutableString * summary;
@property (nonatomic, retain) NSMutableString * mainLink;   
@property (nonatomic, retain) NSMutableString * pubDate;
@property (nonatomic, retain) NSMutableString * author;
@property (nonatomic, retain) NSMutableString * imageLink;

- (id)initWithValues:(NSString *) inTitle mainLink:(NSString *) inMainLink summary:(NSString *) inSummary
             pubDate:(NSString *) inPubDate author:(NSString *) inAuthor imageLink:(NSString *) inImageLink;


//Setter methods
- (void)setTheTitle:(NSString *) inTitle;
- (void)setTheMainLink:(NSString *) inMainLink;
- (void)setTheSummary:(NSString *) inSummary;
- (void)setThePubDate:(NSString *) inPubDate;
- (void)setTheAuthor:(NSString *) inAuthor;
- (void)setTheImageLink:(NSString *)inImageLink;

@end
</code></pre>

<p><strong>Articles.m</strong></p>

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

@implementation Article

@synthesize favorite;
@synthesize title;
@synthesize summary;
@synthesize mainLink;
@synthesize pubDate;
@synthesize author;
@synthesize imageLink;

- (void)dealloc {
    NSLog(@&#34;article dealloc \n&#34;);
    ;
    ;
    ;
    ;
    ;
    ;

    ;
}



- (id)init {

    self = ;
    if(self) {
      // set your properties...
      self.title   = [[ init] autorelease];
      self.mainLink= [[ init] autorelease];
      self.summary   = [[ init] autorelease];
      self.pubDate   = [[ init] autorelease];
      self.author    = [[ init] autorelease];
      self.imageLink = [[ init] autorelease];
      self.favorite = NO;
    }
    return self;
}

- (id)initWithValues:(NSString *) inTitle mainLink:(NSString *) inMainLink summary:(NSString *) inSummary
            pubDate:(NSString *) inPubDate author:(NSString *) inAuthor imageLink:(NSString *) inImageLink
{
    self = ;
    if(self) {
      // set your properties ...
      if (inTitle != nil) {
            self.title = inTitle;
      }

      if (inMainLink != nil) {
            self.mainLink = inMainLink ;
      }

      if (inSummary != nil) {
            self.summary = inSummary;
      }

      if (inPubDate != nil) {
            self.pubDate = inPubDate;
      }

      if (inAuthor != nil) {
            self.author = inAuthor ;
      }

      if (inImageLink != nil) {
            self.imageLink = inImageLink ;
      }

      self.favorite = NO;
    }

    return self;
}


@end
</code></pre>

<p><strong>添加:</strong></p>

<p>看,我的主类中有 <code>NSXMLParser</code>。在我写的主类 .h 文件中:</p>

<pre><code>Article * currentArticle;
</code></pre>

<p>现在在 .m 文件中,当解析器 didStartElement 我分配 Ant 在解析器 didEndElement 中初始化文章时,我释放它 <code></code>;但 delloc 不调用。</p>

<pre><code>- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
                                        qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    // Copy current Xml Element name.
    currentElement = ;
    if () {
      // Clear out our story item caches...
      self.currentArticle = [ init];
    }
    ;

}
</code></pre>

<p><strong>添加测试版</strong></p>

<pre><code>- (void) parser:(NSXMLParser *)parser didStartElement:(NSString *)elementName namespaceURI:(NSString *)namespaceURI
                                        qualifiedName:(NSString *)qName attributes:(NSDictionary *)attributeDict {
    // Copy current Xml Element name.
    currentElement = ;
    if () {
      // Clear out our story item caches...
      self.currentArticle = [ init];
      ;
    }
    ;

}
</code></pre>

<p>看我在初始化之后添加了 <code>;</code> 并将断点放在这里...当我的应用程序第一次进入这部分代码时,它调用 init 但不调用 release第二次调用释放?但为什么 ?这是不对的</p>

<p><strong>为什么我不使用自动释放!!!</strong></p>

<pre><code> self.title   = [[ init] autorelease];
    self.mainLink= [[ init] autorelease];
    self.summary   = [[ init] autorelease];
    self.pubDate   = [[ init] autorelease];
    self.author    = [[ init] autorelease];
    self.imageLink = [[ init] autorelease];
</code></pre>

<p>我没有在这部分代码中使用自动释放,因为我已经读过它给韭菜带来了,因为当我编写自动释放时,对象会在应用程序工作结束时释放!我在写???</p>

<p>谢谢!!!</p></p>
                                    <br><hr><h1><strong>Best Answer-推荐答案</ strong></h1><br>
                                            <p><p>你可以像这样删除每个 setter</p>

<pre><code>- (void)setTheSummary:(NSString *) inSummary
{

    if (self.summary != nil) {
      ;
    }

    self.summary = [ initWithString:inSummary];
}
</code></pre>

<p>您已经将每个 ivar 声明为属性并合成了 getter 和 setter。因此,您可以设置标题,例如:</p>

<pre><code>self.title = newTitle;
</code></pre>

<p>这将重新定义新标题并将其分配给标题并释放先前(如果存在)的值。</p>

<p><strong>编辑</strong></p>

<p>如果你设置属性像</p>

<pre><code>self.title = [ init];
</code></pre>

<p>可变字符串的实例将被过度保留,因此会有泄漏。 </p>

<p>Retain 将保留计数增加 1,这通过属性的声明发生,并且会通过调用 init 增加一。</p>

<p>改成:</p>

<pre><code>self.title = [[ init] autorelease];
</code></pre>

<p><strong>编辑 2</strong></p>

<p>更改这些构造的初始化:</p>

<pre><code>if (inTitle == nil) {
    self.title = [ init];
}
else
{
    ;
    self.title = [ initWithString:inTitle];
}
</code></pre>

<p>收件人:</p>

<pre><code>if (inTitle != nil) {
    self.title = inTitle;
}
</code></pre>

<p>现在添加</p>

<pre><code>self = ;
</code></pre>

<p>并删除</p>

<pre><code>;
</code></pre>

<p>在初始化方法的开头 <code>initWithValues;</code> 这将首先为您初始化属性,它减少了代码重复并使您的类更小。 <code></code> 的删除只需要调用一次 NSObject 的初始化程序,您可以通过调用 <code>self = ;</code> 来执行此操作。 </p>

<p>您已经使用这种模式创建了一个所谓的指定初始化程序。你可以阅读更多关于初始化程序 <a href="http://macdevelopertips.com/objective-c/objective-c-initializers.html" rel="noreferrer noopener nofollow">here</a> .</p>

<p><strong>编辑 3</strong></p>

<p>为了让你的初始化器完美,你应该这样写:</p>

<pre><code>- (id)init
{
    self = ;
    if(self) {
       // set your properties...
    }
    return self;
}
</code></pre>

<p>和</p>

<pre><code>- (id)initWithValues:(NSString *) inTitle mainLink:(NSString *) inMainLink summary:(NSString *) inSummary
            pubDate:(NSString *) inPubDate author:(NSString *) inAuthor imageLink:(NSString *) inImageLink
{
    self = ;
    if(self) {
       // set properties with parameters ...
    }
    return self;
}
</code></pre>

<p>此模式将允许您对指定初始化程序和/或调用继承层次结构的初始化程序中可能发生的错误使用react。这将确保在出现问题时返回 nil,并且您不会将属性设置为错误的实例。</p></p>
                                   
                                                <p style="font-size: 20px;">关于iphone - 类工作不正确。如何让它变得更好?,我们在Stack Overflow上找到一个类似的问题:
                                                        <a href="https://stackoverflow.com/questions/5800916/" rel="noreferrer noopener nofollow" style="color: red;">
                                                                https://stackoverflow.com/questions/5800916/
                                                        </a>
                                                </p>
                                       
页: [1]
查看完整版本: iphone - 类工作不正确。如何让它变得更好?