【问题标题】:Objective C methods [make release] issue [duplicate]目标 C 方法 [make release] 问题 [重复]
【发布时间】:2013-05-12 20:30:05
【问题描述】:

我正在使用最新的 xcode。 实现文件: SimpleCar.m:

#import "SimpleCar.h"

@implementation SimpleCar


// set methods
- (void) setVin: (NSNumber*)newVin {
[vin release];
vin = [[NSNumber alloc] init];
vin = newVin;
}
- (void) setMake: (NSString*)newMake {
[make release];
make = [[NSString alloc] initWithString:newMake];
}
- (void) setModel: (NSString*)newModel {
[model release];
model = [[NSString alloc] initWithString:newModel];
}
// convenience method
- (void) setMake: (NSString*)newMake
    andModel: (NSString*)newModel {
// Reuse our methods from earlier
[self setMake:newMake];
[self setModel:newModel];
}

//get methods
- (NSString*) make; {
return make;
}
- (NSString*) model;{
return model;
}
- (NSNumber*) vin;{
return vin;
}

-(void) dealloc
{
[vin release];
[make release];
[model release];
[super dealloc];
}
@end

接口文件: SimpleCar.h:

#import <Foundation/Foundation.h>

@interface SimpleCar : NSObject {
NSString* make;
NSString* model;
NSNumber* vin;

}
// set methods
- (void) setVin:   (NSNumber*)newVin;
- (void) setMake:  (NSString*)newMake;
- (void) setModel: (NSString*)newModel;
// convenience method
- (void) setMake: (NSString*)newMake
    andModel: (NSString*)newModel;
// get methods
- (NSString*) make;
- (NSString*) model;
- (NSNumber*) vin;

@end

当我输入“[vin release], [model release], [make release]”时,在实现文件中出现错误,我无法运行程序。

【问题讨论】:

  • 这不仅与Xcode无关,而且缺乏所有研究工作。如果你用谷歌搜索错误消息(我假设是“ARC 禁止显式调用释放”),那么你会得到几十个已回答的 SO 问题。
  • 另外,setter 都实现了错误。
  • 无论你从哪里得到那个代码,扔掉源代码,不要再看它了。不仅所有的 setter 实现不正确,而且整个模式看起来就像 15 年前的标准公平。折腾它并获得最新的教程。 (我找到了教程网站——太糟糕了)。
  • 这段代码是在开玩笑吗?那几行充满了严重的内存泄漏......
  • @holex 它来自 tutsplus.com 关于 Objective-C 的“教程”。

标签: objective-c


【解决方案1】:

ARC 已打开,因此内存管理是自动的。

该类的现代定义将声明为:

 @interface SimpleCar : NSObject
 @property(copy) NSString *make;
 @property(copy) NSString *model;
 @property(copy) NSNumber *vin;

 - initWithMake:(NSString*)make model:(NSString*)model vin:(NSNumber*)vin;
 @end

并且将被实现为:

 @implementation SimpleCar
 - initWithMake:(NSString*)make model:(NSString*)model vin:(NSNumber*)vin
 {
     if (self = [super init]) {
         _make = [make copy];
         _model = [model copy];
         _vin = [vin copy];
     }
     return self;
 }
 @end

您通常不会实现像setMake:andModel: 这样的便捷方法。它只是增加了 API 占用空间,并没有真正以方便的方式购买太多东西。它还提出了诸如“当我观察到makemodel 时会发生什么?”之类的问题。

【讨论】:

  • 为什么要复制 NSNumber 属性?感谢您的回答;如果我用strong声明它,可以像这样初始化它:_vin = vin;或 (self.vin = vin)。
  • 习惯; NSNumber 是不可变的,因此 strong 会很好。但是对于任何响应NSCopying 的值类,为了安全起见,我总是指定copy。这样,如果我的 API 的某个调用者传递了 NSNumber 的可变子类,然后再改变该值,我的对象的状态将保持一致。
  • 非常感谢,我会和你一样的:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-27
  • 2016-04-25
  • 2013-05-19
  • 2011-10-24
  • 2014-11-21
相关资源
最近更新 更多