Iphone 在目标c中声明财产(保留)时,什么';s是set/get方法的默认实现

Iphone 在目标c中声明财产(保留)时,什么';s是set/get方法的默认实现,iphone,objective-c,ios,Iphone,Objective C,Ios,我是c级的新手。我已经阅读了关于苹果“内存管理规则”的内存管理文档。但我仍然不太清楚如何管理物业的参考资料 对于使用“retain”注释声明的属性,set/get访问方法的默认实现是什么 这是我的假设,请给出一些意见。谢谢 @interface SubClass : NSObject { NSString * _name; } ... ... @property (nonatomic, retain) NSString * name; ... ... @end -(NSString *) se

我是c级的新手。我已经阅读了关于苹果“内存管理规则”的内存管理文档。但我仍然不太清楚如何管理物业的参考资料

对于使用“retain”注释声明的属性,set/get访问方法的默认实现是什么

这是我的假设,请给出一些意见。谢谢

@interface SubClass : NSObject {
NSString * _name;
}
... ...
@property (nonatomic, retain) NSString * name;
... ...
@end

-(NSString *) setName {
   return _name;
}

-(void) setName: (NSString *) pName{
    // the correct version of default set method for retain
    if( _name != pName ) {
        [_name release];
        _name = [pName retain];
    }

}
那么dealoc方法,可以吗

- (void)dealloc {
    self.name = nil; // or [_name release], _name = nil;

}

您可以在实现文件中使用合成:

@implementation SubClass

@synthesize name = _name;

@end

自动获取默认的getter和setter。

您可以在实现文件中使用synthesis:

@implementation SubClass

@synthesize name = _name;

@end

自动获得默认的getter和setter。

正如Matteo所说,您可以自动合成访问器方法

但说到实施细节:

  • 是的,getter方法可能看起来像(但请注意正确的名称):

    或者,当您使用名称值并释放保存它的对象时,要处理这种情况:

    -(NSString *) name {
       return [[_name retain] autorelease];
    }
    
  • setter方法:

    -(void) setName: (NSString *) pName{
        NSString *temp = [pName retain];
        [_name release];
        _name = temp;
    }
    
  • 解除锁定。您的实现还可以,但由于调用属性可能会导致一些副作用,依赖于对象中的所有字段都是有效的(在dealloc方法中可能不是这样),因此最好直接释放ivar


  • 您的setter示例是错误的,因为您不需要处理nil大小写(实际上在您的代码中,您永远不能将name value设置为nil),但当属性设置为同一对象时,您需要处理大小写。

    正如Matteo所说,您可以自动合成访问器方法

    但说到实施细节:

  • 是的,getter方法可能看起来像(但请注意正确的名称):

    或者,当您使用名称值并释放保存它的对象时,要处理这种情况:

    -(NSString *) name {
       return [[_name retain] autorelease];
    }
    
  • setter方法:

    -(void) setName: (NSString *) pName{
        NSString *temp = [pName retain];
        [_name release];
        _name = temp;
    }
    
  • 解除锁定。您的实现还可以,但由于调用属性可能会导致一些副作用,依赖于对象中的所有字段都是有效的(在dealloc方法中可能不是这样),因此最好直接释放ivar


  • 您的setter示例是错误的,因为您不需要处理nil大小写(实际上在您的代码中,您永远不能将name value设置为nil),但当属性设置为同一对象时,您需要处理大小写。

    正如Matteo Alessani所说,您可以简单地合成属性以获得默认实现

    作为参考,这是生成的内容(我通过阅读和拼凑信息得到):


    正如Matteo Alessani所说,您可以简单地合成属性以获得默认实现

    作为参考,这是生成的内容(我通过阅读和拼凑信息得到):


    作为旁注,在向变量发送
    release
    消息之前,不需要检查变量是否为nil。在Objective C中,您发送给nil对象的任何消息都会被忽略。哦,通常的做法是将
    NSString
    属性声明为
    copy
    而不是
    retain
    ,因为它有一个广泛使用的可变子类。如果有人将您的
    NSString
    属性设置为
    NSMutableString
    子类的实例,他们可以从您下面更改您的数据。这是一篇有关objective-c中属性语法的优秀文章。作为旁注,在向变量发送
    release
    消息之前,不需要检查变量是否为nil。在Objective C中,您发送给nil对象的任何消息都会被忽略。哦,通常的做法是将
    NSString
    属性声明为
    copy
    而不是
    retain
    ,因为它有一个广泛使用的可变子类。如果有人将您的
    NSString
    属性设置为
    NSMutableString
    子类的实例,他们可以从您下面更改您的数据。这是一篇有关objective-c中属性语法的优秀文章。谢谢这是很清楚的。请提供您所遇到的“供参考”链接。我没找到,谢谢!这是很清楚的。请提供您所遇到的“供参考”链接。我没发现。